Mozilla文档中给出的原型概念

时间:2014-12-08 13:09:37

标签: javascript

我正在阅读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吗?如果我们要建立一个原型链,我认为它应该是前者。请解释一下。

1 个答案:

答案 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继承是对象的对象,因此将原型作为您希望新对象继承的蓝图传递是有意义的。