【发布时间】:2015-06-23 22:06:21
【问题描述】:
代码来自MDN:
function Employee() {
this.name = "";
this.dept = "general";
}
function Manager() {
Employee.call(this);
this.reports = [];
}
Manager.prototype = Object.create( Employee.prototype );
function WorkerBee() {
Employee.call(this);
this.projects = [];
}
WorkerBee.prototype = Object.create( Employee.prototype );
var x = new WorkerBee();
console.log( x );
输出:WorkerBee {name: "", dept: "general", projects: Array[0]}
Employee.call(this); 有什么作用?我通过运行代码知道继承必须成功。 .call() 的文档很简单,
方法使用给定的 this 值和提供的参数调用函数 个人。
好的,所以它调用构造函数Employee(),但没有使用new 运算符,也没有return 会返回对象及其属性。 Employee.call(this)如何让子对象继承父属性?
如果省略此行,则只有 projects 数组作为属性存在。
【问题讨论】:
-
这个问题基本上可以归结为“
.call做了什么”。 MDN documentation. -
在对象上调用构造函数会在对象上设置在构造函数中定义的自己的属性。
-
“Employee.call(this) 是如何导致子对象继承父属性的?” 它不继承任何东西。 “如果省略这一行,则只有项目数组作为属性存在。”
Employee是做什么的?它将name和deps分配给this。因此我们可以得出结论Employee.call(this)调用Employee并将其this设置为新对象。也许这有助于更好地理解.call:function foo() { console.log(this.name); }; foo.call({name: 'abc'}); foo.call({name: 'xyz'});。 -
嘿菲利克斯。我想我从你的解释中明白了。