对象简写方法经bind绑定后无法作为构造函数调用的原因咨询
对象简写方法经bind绑定后无法作为构造函数调用的原因咨询
嘿,这个问题挺典型的,我来给你拆解一下背后的核心原因~
首先咱们先明确两种写法的现象差异:
案例1:传统函数定义的对象方法
var workshop = { teacher: "Kyle", ask: function (question) { // 非简写形式 console.log(this.teacher, question); }, }; new (workshop.ask.bind(workshop)); // 运行正常,无报错
案例2:方法简写语法定义的对象方法
var workshop = { teacher: "Kyle", ask(question) { // 简写形式 console.log(this.teacher, question); }, }; new (workshop.ask.bind(workshop)); // 抛出 TypeError: workshop.ask.bind(...) is not a constructor
造成这种差异的根源,在于两种方式创建的函数,内部的[[Construct]]特性完全不同:
- 对于传统
function关键字定义的函数,哪怕它被当作对象的属性,本质上还是普通函数。这类函数具备[[Construct]]内部方法——这是函数能被new当作构造函数调用的核心条件。当你用bind给它绑定this后,返回的绑定函数依然保留了[[Construct]]能力:用new调用绑定函数时,会直接忽略之前绑定的this,创建一个新的实例对象并将其作为this传入原函数。 - 而对象方法简写语法(
ask(question) {...})创建的函数,属于ECMAScript规范里的方法函数。这类函数被专门设计为只能作为对象的方法调用,不具备[[Construct]]内部方法——也就是说从根源上就禁止被当作构造函数使用。当你对它调用bind时,返回的绑定函数也继承了这个特性,没有[[Construct]]能力,所以用new调用它自然就会抛出“不是构造函数”的TypeError。
简单总结一下:方法简写的函数天生不能被new,绑定后的函数也继承了这个限制,而普通函数则没有这个约束~
备注:内容来源于stack exchange,提问作者Amit Dhaterwal
相关产品推荐
相关产品推荐

