2013-02-22 35 views
0

從我的理解中,Prototype對象是其他對象繼承屬性和方法的對象,基本上它擁有一個構造器屬性,指向或指向構造函數創建Object.Please考慮下面的代碼:結合使用JS的原型和構造器屬性

function Animal() 
{ 
this.name="no name"; 
} 

function Cat() 
{ 
    Animal.Call(this);   //Please Explain 
    this.mood="sleepy"; 
} 

Cat.prototype=new Animal();  //Cat inheriting Animal? 
Cat.prototype.constructor=Cat; //Please Explain 

請解釋清楚,但在細節的代碼行意見和反映的概念,謝謝。

+1

你可能是指'Animal.call(this);'。你究竟想要解釋什麼?什麼'.call'呢?爲什麼它在那裏?或者是什麼?順便說一句,更好的建立原型是'Cat.prototype = Object.create(Animal.prototype);'。在那時你的代碼中,你不想創建一個新的'Animal'實例。 – 2013-02-22 13:59:08

+0

是的,我想知道'Animal.call(this)'和'Cat.prototype.constructor = Cat'的用途是什麼,'謝謝。 – MrShabana 2013-02-22 14:05:01

回答

1

什麼的Animal.call(this)

的目的,就像在其他編程語言調用super()。它調用剛剛創建的新對象(this)上的父構造函數(Animal)。這也在MDN documentation about .call中解釋。

在您的示例中,Animal"no name"指定爲this.name。因此,在致電Animal.call(this);後,this將具有name財產與上述價值。

Cat.prototype.constructor=Cat;

默認情況下,每個原型的constructor屬性指向功能,它屬於。但是由於您用Cat.prototype=new Animal();覆蓋了原型,現在constructor屬性指向一個不同的功能。在這種情況下,由於new Animal返回從Animal.prototype繼承的對象,因此Cat.prototype.constructor將指向Animal。爲了解決這個問題,我們再次指定Cat

嚴格地說,這是沒有必要的,因爲constructor屬性沒有在任何內部函數中使用。但是,如果您的代碼依賴於它,則必須將其設置爲正確的值。

+0

謝謝菲利克斯,真的很有幫助 – MrShabana 2013-02-22 14:32:06

+0

不客氣! – 2013-02-22 14:36:56