在类中声明方法与在JavaScript中使用类原型之间的区别

在类中声明方法与在JavaScript中使用类原型之间的区别,javascript,Javascript,当我们在一个类中声明我们的方法时有什么区别吗 class Foo { ... doSomething(){ ... } } 还是直接到类原型 class Foo { ... } Foo.prototype.doSomething = function(){ ... } 将方法定义为类的一部分时,某些限制适用: 它不能是箭头函数 它不能用作构造函数 使用.prototype.doSomething=符号时,这些限制不适用 这些限制也不适用于较新

当我们在一个类中声明我们的方法时有什么区别吗

class Foo {
   ...
   doSomething(){
     ...
   }
}
还是直接到类原型

class Foo {
    ...
}

Foo.prototype.doSomething = function(){
    ...
}

将方法定义为
类的一部分时,某些限制适用:

  • 它不能是箭头函数
  • 它不能用作构造函数
使用
.prototype.doSomething=
符号时,这些限制不适用

这些限制也不适用于较新的(实验性的,在撰写本文时的第3阶段):

可以将箭头函数分配给这样的字段,也可以将
函数分配给
。在后一种情况下,该函数可以用作构造函数


但是,分配给实例字段的函数不是原型方法,而是实例成员,因此它与您在问题中选择的
.prototype
方法不完全一致。

如果您查看传输到ES<6的
代码,您会发现它是类似的,但是

简而言之,类将执行此操作(伪代码):


主要区别在于,一种样式是可读的,而另一种样式不是:-)对于所有正常用途,它们的行为是相同的

但是,它们在细节上确实有所不同:

  • 分配的方法是匿名的,定义的方法具有
    .name
  • 分配的
    函数
    具有
    .prototype
    并且是可构造的,而定义的方法没有
  • 指定的方法是可枚举的,而定义的方法不是
  • 指定的方法不能使用
    super
    关键字

这是一个JavaScript问题,与React Directly无关谢谢,刚刚编辑我们只做
Foo.prototype.doSomething=function(){…}
仅当通过
函数构造函数声明时
不是类实际上你可以做箭头函数(
doSomething=()=>…
),根据建议,你的第一点是不正确的。尽管它是一个实例方法,而不是一个方法。因此,对于两个实例
f1
f2
,它不认为
f1.doSomething==f2.doSomething
与原型上的方法相同。谢谢你们,我已经添加了这一信息并限定了这一点。
Object.defineProperty(Foo.prototype, 'doSomething', doSomething)