为什么我不能用另一个类替换类的原型?

lei*_*paC 4 javascript javascript-objects

给定两个类,我想给出一个到另一个的方法:

class a {}
class b {say() {console.log('hello')}}
var foo = new a();
Run Code Online (Sandbox Code Playgroud)

为什么这样有效:

a.prototype.say = b.prototype.say;
foo.say();    //'hello'
Run Code Online (Sandbox Code Playgroud)

但这不是吗?

a.prototype = b.prototype;
foo.say();    //foo.say is not a function
Run Code Online (Sandbox Code Playgroud)

要清楚,我不是问如何将一个类的方法给另一个类,但为什么原型的行为是这样的.

额外问题:在类块中定义方法与通过直接将其分配给原型来定义方法之间的区别是什么?

Mar*_*yer 5

原因是prototype在类上是一个不可写,不可配置的属性:

class a {}
class b {say() {console.log('hello')}}

console.log(Object.getOwnPropertyDescriptor(a,'prototype'))
Run Code Online (Sandbox Code Playgroud)

不可写意味着您无法重新分配属性,prototype并且不可配置意味着您无法更改属性以创建writable: true或删除属性.

结果是这没有效果:

class a {}
class b {say() {console.log('hello')}}

a.prototype = b.prototype;
console.log(a.prototype === b.prototype)
Run Code Online (Sandbox Code Playgroud)

但是不可写只意味着你不能改变与属性相关的值a.prototype- 它总是指向同一个对象 - 它并不意味着你不能向该对象添加属性.这就是你仍然可以添加的原因a.prototype.say.

  • 另外值得补充的是,这与声明`function a(){}`和`function b(){}`略有不同,其中`a.prototype = b.prototype`实际上会改变prototype属性. (2认同)