为何JavaScript中类方法无法作为构造函数使用?
为什么
new f.baz()有效而new f.bar()会报错 先看你的代码示例:
class Foo { bar() {} } Foo.prototype.baz = function() {}; const f = new Foo(); new f.baz(); // 正常执行 new f.bar(); // 抛出TypeError
核心差异:类方法的不可构造特性
- 类体中定义的
bar是类原型方法,这类方法被ECMAScript规范设定为不可构造(non-constructable)。它们没有[[Construct]]内部方法槽——这个内部槽是new操作符调用函数的必要条件,没有它的话,用new调用就会直接报错。 - 直接赋值给
Foo.prototype.baz的是普通函数,这类函数默认拥有[[Construct]]内部槽,支持new操作符调用,能正常生成新实例。
对应ECMAScript规范说明
根据ECMAScript语言规范:
类定义中的方法(包括原型方法、静态方法)会被初始化为不可构造的函数对象。这类函数的
[[Construct]]内部方法会抛出TypeError,而普通字面量函数默认具备合法的[[Construct]]实现,允许通过new调用。
简单说,类里定义的方法本质上是被特殊处理过的函数,禁止用作构造器;而直接挂到原型上的普通函数没有这个限制。
内容的提问来源于stack exchange,提问作者pixatlazaki
相关产品推荐
相关产品推荐

