给出两个要在其中提供一种方法的类:
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
要清楚一点,我并不是问如何将一个类的方法提供给另一类,而是为什么原型的行为是这样的。
奖金问题:在类块中定义方法与通过直接将其分配给原型进行定义之间有什么区别?
答案 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
的原因。