[英]javascript prototype and new object confusion
在瀏覽前端主機時,我在下面幾乎沒有困惑。 有人可以告訴我有什么區別嗎? (在創建對象Chordate和Chordate2和Chordate3嗎?)。 它們在本質上有何不同?
我以為總是用newObject = new構造函數是用javascript構建新對象的方法,但是newObject.prototype = new構造函數使我失望。
Animal = function(name){this.name = name};
Animal.prototype.eats = function(){
return this.name + " is eating"
}
Chordate = function(name){this.name = name;}
Chordate.prototype = new Animal();
Chordate2 = function(name){this.name = name;}
Chordate2 = new Animal();
Chordate3 = new Animal();
-我自己的答案-
可能我需要觀看更多視頻(因為我假設他們會建議您不要這樣做,但我確實了解現在的工作原理。這是我的困惑和澄清。
創建的每個函數(是另一個對象)都指向它自己的原型(基本上是對象)Chordate已經是一個對象,並且具有指向自己的對象(原型)的原型,這條線(Chordate.prototype = new Animal ();)正在將.prototype點更改為Animal原型。 (看起來確實很hacky,我需要閱讀和觀看更多內容)。
因此,基於Chordate2的原型,它也是它自己的原型,並且當您在其上運行新Animal時,它會刪除它並且僅存在Animal.prototype。
相同的w /(除了Chordate3.prototype永遠不存在)Chordate3。
有人可以幫我驗證一下嗎?
這就是繼承最初是在javascript中工作的方式(即使對於類,底層機制也相同)。
基本上Chordate是Animal的子類。 用其他語言,我們會寫:
class Chordate extends Animal {
}
在javascript中,構造函數從對象繼承。 由於Animal()
是構造函數,我們需要將其轉換為對象。 因此,在JavaScript中,我們這樣做:
Chordate.prototype = new Animal(); // extend Animal
prototype
屬性包含一個原型或模板,用於說明構造函數創建的對象的外觀。 在這種情況下,由Chordate
創建的對象應看起來像Animal
對象。 當你調用new Chordate()
的原型將被復制到this
,將返回一個新的實例。
Chordate2
和Chordate3
只是Animal
實例。 從代碼和對象的命名來看,它們看起來像是不熟悉javascript的人所混淆的代碼。 我個人希望像chordate2 = new Chordate()
這樣的東西。
第一個Chordate分配“ Chordate = function(name){this.name = name;}”分配的構造函數與Animal相同,然后下一行將Animal()構造函數添加到Chordate對象。
然后,Chordate2從構造函數分配開始,然后由於未將任何參數傳遞給構造函數而被覆蓋為具有未定義名稱屬性的Animal對象。
最后,Chordate3只是具有未初始化名稱屬性的Animal對象。
我確實對回答自己的問題並將其作為答案感到很可笑,但正如@torazaburo所建議的那樣,這對我來說很有幫助,因為批評家實際上是提供答案的人(到目前為止,我只問過),即使這是錯誤的,所以它去了:
部分混淆在於以下內容到底是什么
Object.prototype
我完全理解,在創建函數(動物)時,它指向自己的原型(依次指向基本對象(它是自己的原型)(通過向上的原型鏈找到)。
創建Chordate函數時,它指向的是它自己的原型。 但是,當運行Chordate.prototype = new Animal時,它實際上改寫了自己的原型,並指向Animal的原型。 不管是否建議不要這樣做,我都渴望找出原因。 我想我更專注於學習此Object.prototype的工作方式以及與otherObject(在本例中為Animal)的關系。
When Chordate2 is ran, 1)it creates a function and have it point to it's own prototype 2)when you run new Animal() = Chordate2, it essentially erases Chordate2 and creates a brand new object and only prototype remains is Animal.prototype. Chordate2's relationship to that is found through __proto__
相同的概念(除了不存在Chordate3.prototype除外)Chordate3。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.