You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

对象简写方法经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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 14:20:29