javascript - 为什么我不能用另一个类的原型替换一个类的原型?
问题描述
给定两个类,我想将一个类的方法提供给另一个类:
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
需要明确的是,我不是在问如何将一个类的方法提供给另一个类,而是为什么原型会这样。
额外的问题:在类块中定义方法和通过直接将其分配给原型来定义它有什么区别?
解决方案
这样做的原因是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
.
推荐阅读
- google-apps-script - 发送选中该框的电子邮件
- python - 将元组作为变量传递
- php - laravel 一对多关系,不显示数据
- vue.js - bootstrap vue 网站使用什么来弹出搜索结果
- c# - 使用 db.find 后收到实体错误
- java - android studio中不存在主要活动
- r - 根据另一列将多列组织成一行
- typescript - 转换对象输入参数以赋予它们类型,以便 TypeScript 不会抱怨
- css - 如何将图标保留在右上角的 bootstrap 4 导航栏中以进行移动视图
- android - 如何将复选框添加到我的 recyclerviewer xml?