我正在阅读Mozilla文档(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Details_of_the_Object_Model)中给出的JavaScript对象模型,并且可能是一个非常愚蠢的问题。
如您所见,它描述了基于原型的继承层次结构(Manager继承自Employee),如下所示:
function Employee() {
this.name = "";
this.dept = "general";
}
function Manager() {
Employee.call(this);
this.reports = [];
}
Manager.prototype = Object.create(Employee.prototype);
最后一行不应该说Employee
而不是Employee.prototype
吗?如果我们要建立一个原型链,我认为它应该是前者。请解释一下。
答案 0 :(得分:1)
这是因为Object.create
期望原型作为第一个参数。您可以在以下link找到所有规格。
我还继续测试你建议的案例,并显示了一个有趣的行为。
案例#1
function Employee() {
this.name = "";
this.dept = "general";
}
function Manager() {
Employee.call(this);
this.reports = [];
}
Manager.prototype = Object.create(Employee.prototype);
如果我们创建一个新的Manager(),我们会得到以下结果:
var x = new Manager();
console.log(x);
控制台输出:经理{name:“”,dept:“general”,reports:Array [0]}
如果我们根据您的建议更改代码并将Employee作为参数而不是Employee.prototype传递:
案例#2
function Employee() {
this.name = "";
this.dept = "general";
}
function Manager() {
Employee.call(this);
this.reports = [];
}
Manager.prototype = Object.create(Employee);
如果我们现在继续创建一个管理器,新创建的对象将不包含{strong>案例#1 中的name
属性:
var y = new Manager();
console.log(y);
控制台输出:经理{dept:“general”,报告:数组[0]}
编辑#1
我做了一些研究,发现了另一个关于Stackoverflow(link)的问题,可以解释这种行为。
它似乎与构造函数的行为方式有关。
正如前面提到的线程中所述,当您使用new运算符创建对象时,您基本上创建了一个从该对象的原型继承的新对象。
因此,由于JavaScript继承是对象的对象,因此将原型作为您希望新对象继承的蓝图传递是有意义的。