我在ES5中的Javascript中找到了以下用于创建继承的代码。在这种情况下,Employee
继承自Person
。
function Employee(name, title) {
Person.call(this, name); // super(name)
this.title = title;
}
Employee.prototype = Object.create(Person.prototype);
Employee.prototype.constructor = Employee;
Employee.prototype.describe = function() {
return Person.prototype.describe.call(this) // super.describe()
+ ' (' + this.title + ')';
};
我不明白这一行:
Employee.prototype.constructor = Employee;
所以Employee
已在第一行定义。为什么我们需要为它创建一个构造函数并将其初始化为自身?这是如何工作的?
答案 0 :(得分:2)
您不是创建构造函数,只是将属性constructor
指向现有属性。如果不这样做,那将会产生误导,因为使用constructor
创建的实例继承的new Employee
属性为Person
,而不是Employee
:
function Person() {
}
function Employee() {
Person.call(this);
}
Employee.prototype = Object.create(Person.prototype);
var per = new Person();
var emp = new Employee();
console.log(per.constructor === Person); // true
console.log(emp.constructor === Employee); // false?
console.log(emp.constructor === Person); // true?!?!!
答案 1 :(得分:0)
Object.create为您提供了一个新对象,它是Person函数的原型链接。一旦你宣布了Employee的原型,你还需要添加链接构造函数属性,那就是在线完成的事情
Employee.prototype.constructor = Employee;