javascript - JavaScript Prototype 属性未添加到其继承的对象
问题描述
我正在关注关于添加属性的MDN指南,这就是我的代码的样子
'use strict';
function Employee() {
this.name = '';
this.dept = 'general';
}
Employee.prototype.specialty = 'none';
function Manager() {
Employee.call(this);
this.reports = [];
}
Manager.prototype = Object.create(Employee.prototype);
Manager.prototype.constructor = Manager;
function WorkerBee() {
Employee.call(this);
this.projects = [];
}
WorkerBee.prototype = Object.create(Employee.prototype);
WorkerBee.prototype.constructor = WorkerBee;
function SalesPerson() {
WorkerBee.call(this);
this.dept = 'sales';
this.quota = 10;
}
SalesPerson.prototype = Object.create(WorkerBee.prototype);
SalesPerson.prototype.constructor = SalesPerson;
function Engineer() {
WorkerBee.call(this);
this.dept = 'engineering';
this.machine = '';
}
Engineer.prototype = Object.create(WorkerBee.prototype);
Engineer.prototype.constructor = Engineer;
let mark = new WorkerBee;
console.log(mark);
mark.name = 'Doe, Mark';
mark.dept = 'admin';
mark.projects = ['navigator'];
console.log(mark);
mark.bonus = 3000;
console.log(mark);
当我运行它时,我没有看到对象specialty
的属性mark
。
WorkerBee { name: '', dept: 'general', projects: [] }
WorkerBee { name: 'Doe, Mark', dept: 'admin', projects: [ 'navigator' ] }
WorkerBee {
name: 'Doe, Mark',
dept: 'admin',
projects: [ 'navigator' ],
bonus: 3000 }
我错过了什么?
谢谢
更新
根据@adiga 的回答,我能够specialty
在原型链中找到该属性。
解决方案
这是因为它不是实例属性,而是继承属性。它实际上在那里,检查它只是 console.log(mark.specialty)。
编辑以扩展答案
继承的属性意味着该属性存在于原型链而不是它自身的实例中:当您为此分配某些东西时,就像
this.age = 13;
您正在设置一个实例属性一样,当您将某些东西分配给用于创建您正在设置的实例的原型时继承属性在其他语言中称为静态属性(在 ES6 中称为静态属性)。
当您尝试读取类似 的属性object.someProperty
时,JS 引擎首先查看实例属性(如果存在),它会返回它,否则它会查看原型链(从一个原型到其父原型)直到找到该属性或到达最终安装的原型是 null 并且在这种情况下返回 undefined )
推荐阅读
- flutter - 如何从flutter中的特定节点firebase实时数据库获取列表数据
- python - 通过它在 selenium 中的文本单击一个按钮
- c# - PC 重新启动后,Microsoft OPOS 挂在 Claim 上
- java - 我把我的try catch放在一个do while循环中,但是do-while循环之后的命令继续运行,即使有一个异常被捕获
- flutter - How to add a DataRow in Flutter?
- autodesk-forge - 使用 Autodesk Forge 上传和翻译模型时如何获得未过期的骨灰盒
- r - 可以指定 R 中 lm() 中主效应与交互项的顺序吗?
- java - 升级 Play 项目依赖项时出现 Jackson 'NoSuchMethodError: com.fasterxml.jackson.databind.introspect.AnnotatedMember.getType' 错误
- python-3.x - 我们可以通过 AWS SES 服务将目录发送到电子邮件吗
- arrays - 结构中的枚举数组打印变体名称和值