2016-11-14 180 views
-1

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

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

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

我们可以使用,即使不设置的Manager原型Employee的传承。

+5

尝试'新的经理()instanceof员工'没有它,或尝试把东西放在'员工'的原型。 – Ryan

回答

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'