JavaScript继承原型

时间:2016-11-14 05:40:01

标签: javascript inheritance

如果我们在每个子函数中使用this来调用构造函数方法,我们为什么能直接继承父属性,我们为什么需要设置原型对象来继承呢?

function Employee() {
  this.name = "";
  this.dept = "general";
}

function Manager() {
  Employee.call(this);
  this.reports = [];
}
Manager.prototype = Object.create(Employee.prototype);

即使我们没有将Manager的原型设置为Employee,我们也可以使用继承。

1 个答案:

答案 0 :(得分:1)

通常使用原型将函数/方法放在它们上,而不是属性,因为使用属性,您将在所有对象实例之间共享一个属性值。此外,如果在构造函数中添加方法,则可能不需要为继承设置原型。例如:

function Employee(name) {
  this.name = "";
  this.dept = "general";
  this.reportName = function() {return this.name};
}

function Manager(name) {
  Employee.call(this, name);
  this.reports = [];
}

var manager = new Manager('Peter');
manager.reportName(); // Peter

但是,在对象的构造函数中添加方法/函数效率很低,因为每次调用构造函数时都会创建函数的实例。通常,所有方法,而不是属性,都在原型上分配,如下所示:

function Employee(name) {
  this.name = "";
  this.dept = "general";
}

Employee.prototype.reportName = function() {return this.name};

现在,在这种情况下,简单地调用构造函数就不够了:

function Manager(name) {
  Employee.call(this, name);
  this.reports = [];
}

var manager = new Manager('Peter');
manager.reportName(); // throws an error

您需要设置原型:

Manager.prototype = Object.create(Employee.prototype)

var manager = new Manager('Peter');
manager.reportName(); // 'Peter'