2016-11-14 212 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'