2014-01-05 270 views
0

我下面就JS繼承的視頻教程,我被困在最後2行的代碼如下:JavaScript繼承。從另一個類繼承的對象和方法

http://i.imgur.com/A9DDMHL.jpg

上述假設有一個Animal類,我們希望使用屬性和方法。

我似乎獲得倒數第二:Cat.prototype = new Animal()。它是否認爲給貓的原型分配一個新的動物物體?但我無法理解最後一行代碼。

回答

2

我會推薦閱讀這篇文章

prototype屬性提供的方法和屬性會從您通過Cat構造函數創建一個對象被繼承的對象。而constructor不過是一個常規屬性,通常用於標識用於創建對象的構造函數。

+0

我明白了!你不能做新的貓(),因爲如果我們這樣做,我們錯過了動物的所有屬性和方法。對? – user3162361

+0

如果您閱讀參考文章,您會發現構造函數屬性不會執行任何功能,您可以使用它進行操作! – ColinE

0

Cat.prototype = new Animal()Cat類繼承該方法和Animal類,最可能的性能,因爲CatAnimal,和再利用從AnimalCat類浪費時間的方法。

Cat.prototype.constructor = Cat只是使Cat類的構造函數成爲上面爲所有Cat對象所做的構造函數。

+1

這完全錯了。不要談論非班級語言的班級和超班。 – farvilain

+0

看看這個:http://www.codecademy.com/courses/objects-ii/3/3?curriculum_id=506324b3a7dffd00020bf661 –

+1

看看這個:http://www.ecma-international.org/publications/files/ECMA -ST/Ecma-262.pdf 4.2.1:[ECMAScript不使用C++,Smalltalk或Java中的類],即使青少年在公共wiki上寫了相反的內容。 – farvilain

0

首先,JavaScript不是基於類的語言。它不知道類的概念,但它知道對象和這兩個組件,我們可以模擬類的行爲並實現繼承。

但是,由於這一切都是一種解決方法,我們有時必須付出額外的努力才能使其發揮作用。並且這是您最後一行Cat.prototype.constructor = Cat進來的地方。

每個函數的prototype屬性都有一個屬性,稱爲constructor,它指向函數本身。因此,當您將該函數用作構造函數時,內部對象[[prototype]]也具有constructor屬性。

function Cat() { 
} 

var cat = new Cat(); 
console.log(Cat.prototype.constructor); //Cat 
console.log(cat.constructor); //Cat 

但是,如果你申請你的遺傳模式,重寫的Cat完整prototype財產及其所有屬性,包括constructor財產。

function Cat() { 
} 

Cat.prototype = new Animal(); 

var cat = new Cat(); 
console.log(Cat.prototype.constructor); //Animal 
console.log(cat.constructor); //Animal 

爲了解決這個問題,我們必須手動設置constructor屬性:

function Cat() { 
} 

Cat.prototype = new Animal(); 
Cat.prototype.constructor = Cat; 

var cat = new Cat(); 
console.log(Cat.prototype.constructor); //Cat 
console.log(cat.constructor); //Cat