为什么构造函数在继承时初始化为自身

时间:2018-01-20 09:19:40

标签: javascript

我在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已在第一行定义。为什么我们需要为它创建一个构造函数并将其初始化为自身?这是如何工作的?

2 个答案:

答案 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;