首页 > 解决方案 > 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在原型链中找到该属性。

在此处输入图像描述

标签: javascriptinheritanceprototype

解决方案


这是因为它不是实例属性,而是继承属性。它实际上在那里,检查它只是 console.log(mark.specialty)。

编辑以扩展答案

继承的属性意味着该属性存在于原型链而不是它自身的实例中:当您为此分配某些东西时,就像 this.age = 13; 您正在设置一个实例属性一样,当您将某些东西分配给用于创建您正在设置的实例的原型时继承属性在其他语言中称为静态属性(在 ES6 中称为静态属性)。

当您尝试读取类似 的属性object.someProperty时,JS 引擎首先查看实例属性(如果存在),它会返回它,否则它会查看原型链(从一个原型到其父原型)直到找到该属性或到达最终安装的原型是 null 并且在这种情况下返回 undefined )


推荐阅读