2013-10-14 47 views
3

爲什麼this.name = name;在企鵝和皇帝班,爲什麼this.numLegs = numLegs;被遺漏了?是因爲你可以設置這些屬性嗎?javascript inheritence爲什麼財產被遺漏在一些?

// original classes 
function Animal(name, numLegs) { 
    this.name = name; 
    this.numLegs = numLegs; 
    this.isAlive = true; 
} 
function Penguin(name) { 
    this.name = name; 
    this.numLegs = 2; 
} 
function Emperor(name) { 
    this.name = name; 
    this.saying = "Waddle waddle"; 
} 

// set up the prototype chain 
Penguin.prototype = new Animal(); 
Emperor.prototype = new Penguin(); 

var myEmperor = new Emperor("Jules"); 

//console.log(myEmperor.saying); // should print "Waddle waddle" 
//console.log(myEmperor.numLegs); // should print 2 
//console.log(myEmperor.isAlive); // should print true 
console.log(myEmperor.name); 
+2

答案是因爲開發人員選擇不從構造函數中的參數設置該屬性。這只是一個設計決定。 – marteljn

+0

請詳細說明一下。 – Mozak

+0

對不起,但我找不到這個腳本的一些問題。 – Red

回答

1

第一類,動物代表通用動物。有些動物有2條腿,有些有4條,所以當你實例化一個通用動物時,你需要說出它有多少條腿。這就是爲什麼numLegs參數傳遞給構造函數的原因。

var fluffyTheCat = new Animal('Fluffy', 4); 

第二類只代表企鵝,衆所周知,所有的企鵝都有兩條腿。你不必說了多少腿企鵝也有,所以不要說:

var pingyThePenguin = new Animal('Pingy', 2); 

你可以說:

var pingyThePenguin = new Penguin('Pingy'); 

皇帝是特殊的企鵝,不像普通企鵝也有一個說法。但是他們都有同樣的說法,所以你也不需要把它傳遞給構造函數。


稍微偏離主題

在你的榜樣繼承輕微破損。你不應該實例化基類來獲取繼承類的原型。具體來說:

Penguin.prototype = new Animal(); 

有點壞了。

相反,你可以做線沿線的東西:

Penguin = new function(name) { 
    // inherits from Animal 
    Animal.call(this, name,2); 
} 

Penguin.prototype = Object.create(Animal.prototype); 

Emperor = new function(name) { 
    // inherits from Penguin 
    Penguin.call(this, name);  
    this.saying = "Waddle waddle"; 
} 

Emperor.prototype = Object.create(Penguin.prototype); 
0

您可以使用此功能

var myEmperor = new Emperor("Jules"); 

其中給出的名字,但你不初始化numlegs

例子:

var myEmperor =new Penguin('ss'); 
+0

這裏你創建了處理numlegs的對象; –

+0

包含'numlegs'的對象是原型的一部分,但屬性'numlegs'本身不是原型的一部分。 – Adam

0

第一個叫Animal是通用的,因此它可以有很多不同的腿,在另一個Penguin以及企鵝有2個腿這麼這是原因,最後一個Emperor不是動物,也不是創造一個動物,這就是爲什麼它不創造任何腿。

相關問題