首页 > 解决方案 > 为什么我不能用另一个类的原型替换一个类的原型?

问题描述

给定两个类,我想将一个类的方法提供给另一个类:

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

需要明确的是,我不是在问如何将一个类的方法提供给另一个类,而是为什么原型会这样。

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

标签: javascriptjavascript-objects

解决方案


这样做的原因是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.


推荐阅读