2014-01-06 40 views
1

我有這段代碼。原型繼承和設置值

Animal = function(age) 
{ 
    Animal.prototype.age = age; 
}; 
Animal.prototype.constructor = Animal; 

Animal.prototype.Walk = function() 
{ 
    console.log("Animal Walking"); 
}; 


Pet = function(age, name) 
{ 
    Pet.prototype.name = name; 
}; 
Pet.prototype.constructor = Pet; 
Pet.prototype = Object.create(new Animal()); 


Pet.prototype.DoTricks = function() 
{ 
    console.log(this.name + " is doing tricks!"); 
}; 

var pet = new Pet(5, "Barney"); 

console.log(pet); 

所有的動物有一個年齡,可以走路。 寵物通過其原型繼承動物。 寵物有名字,可以做技巧,他們也有年齡,可以走路。

如何組織我的代碼來實現此行爲?目前我可以做到這一點,所以寵物可以走路,但他們的年齡沒有定義,因爲我無法通過構造函數超過它的年齡。

非常感謝!

+5

提示:不要修改構造函數中的'prototype'。 'prototype'在所有實例之間共享,而構造函數則應該修改單個實例('this')。 –

+2

提示:在設置原型的部分之前,'Pet.prototype.constructor = Pet;'行不會執行任何操作。另外,'Pet = function(age,name)'是未聲明的,你應該使用'function Pet(age,name)'(它也給它一個名字並且在嚴格模式下工作)。 – Ryan

回答

1

從構造參數傳遞給它的基地,你可以用.call().apply()執行基本構造:

var Pet = function (age, name) { 
    Animal.call(this, age); 
    // ... 
}; 

兩者都會使基本構造與同一範圍內調用(this)值。


你也只需要修改prototype以外的任何構造的,因爲它的屬性和它們的值將所有實例之間共享。

var a = new Animal(10); 
var b = new Animal(15); 
console.log(a.age); // 15 rather than its own 10 

要設置每個實例的附加屬性,你會想,而不是修改上下文this

var Animal = function (age) { 
    this.age = age; 
}; 

var Pet = function (age, name) { 
    Animal.call(this, age); 
    this.name = name; 
}; 

而且,對於constructor性質:

初始prototype對象將已經具有constructor屬性集。那麼,是不是平時就要自己設置:

Animal.prototype.constructor = Animal; 

除非你完全替換初始prototype對象。對於這種情況,您需要在之後重置constructor,否則它將被設置爲正在替換的初始對象。

Pet.prototype = Object.create(Animal.prototype); 
Pet.prototype.constructor = Pet; 
+0

謝謝!這可能是我幾天來的最佳答案。 –