为什么我不能用另一个班级的原型代替一个班级的原型?

时间:2018-08-23 19:54:26

标签: javascript javascript-objects

给出两个要在其中提供一种方法的类:

class a {}
class b {say() {console.log('hello')}}
var foo = new a();

这是怎么工作的:

a.prototype.say = b.prototype.say;
foo.say();    //'hello'

但这不是吗?

a.prototype = b.prototype;
foo.say();    //foo.say is not a function

要清楚一点,我并不是问如何将一个类的方法提供给另一类,而是为什么原型的行为是这样的。

奖金问题:在类块中定义方法与通过直接将其分配给原型进行定义之间有什么区别?

1 个答案:

答案 0 :(得分:5)

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

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

console.log(Object.getOwnPropertyDescriptor(a,'prototype'))

不可写意味着您不能重新分配属性prototype,而不可配置意味着您不能将属性更改为writable: true或删除该属性。

结果是这无效:

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

a.prototype = b.prototype;
console.log(a.prototype === b.prototype)

但是不可写仅表示您不能更改与属性a.prototype关联的值-它始终指向同一对象-并不意味着您不能向该对象添加属性。这就是为什么您仍然可以添加a.prototype.say的原因。