2013-12-11 171 views
7

關於prototype的問題: 爲什麼某些數組方法有.prototype而其他數不?爲什麼某些方法有.prototype和其他方法沒有?

JavaScript Array method names screenshot

documentation狀態 「Array.prototype代表的原型Array構造」。

我試圖調和這個聲明,並理解prototype是一個涉及父類型的屬性,因爲這是如何實現繼承。

如果後者爲真,那麼Array誰擁有map()indexOf()等方法的父類型是什麼?

我的主要問題是在第一行。

+0

所有函數都具有'.prototype'屬性。 – Bergi

+1

@Bergi你是否確信;)? (提示'.bind'和主機環境定義的函數) –

+2

@BenjaminGruenbaum:哎呀,你說得對。只有本機*構造函數*和任何用戶創建的函數對象才具有'.prototype'屬性。感謝您的提醒! – Bergi

回答

5

我試圖調和的理解是原型是指父類型的屬性,因爲這是如何繼承實現了這一說法。

否。與另一個對象(從中繼承屬性)的原型關係通過不可見鏈接完成,有時表示爲[[prototype]]

構造函數實際上存在的.prototype屬性是該函數構造的所有實例將繼承的對象。

所以數組對象的原型(繼承)鏈是這樣的:

       null 
          ^
           | 
Object.prototype ---> {hasOwnProperty(), …} // all objects inherit these 
          ^
           | 
Array.prototype ----> {map(), indexOf(), …} // all arrays inherit these 
          ^
           | 
         {length, 0, 1, 2, …} // an example array 
         // as if constructed by new Array(5) or [42, 7, 6] 

爲什麼有些方法有.prototype有的沒有?

上可用的.prototype將由所有情況下被繼承的功能,你可以直接打電話給他們上他們,如果他們都在他們的方法。

直接放置在構造函數(如Array.isArrayArray.of)上的函數不是與實例相關的,也可以是「靜態」的。你主要用非數組作爲參數來調用它們。

5

不在原型上的方法類似於某些其他語言中的「類」方法(類型;相似性很膚淺)。原型上的方法可以從任何數組實例的上下文中調用;直接在構造函數上的方法不是。

「length」屬性是每個數組實例的屬性;在構造函數中也有一個「length」屬性,但它的含義完全不同,它告訴你函數中有多少形式參數(數組函數)。

Array的「父類型」,在JavaScript中有這種意義的地方是「Object」,但這與Array原型上的方法沒有任何關係。

+0

我想贊成這是正確的,但'類'方法比喻困擾着我。請考慮擴大發生的事情。主要問題在於原型上的方法可用於每個數組,並且通常具有動態「this」。 –

+0

@BenjaminGruenbaum你能幫我一下,讓我知道究竟是什麼讓你感到困擾?我的意思是,它也困擾我,但我很好奇你在這裏的確切關切。 – Pointy

+0

@BenjaminGruenbaum啊,我剛剛添加了另一句話,巧合。 – Pointy

4

Array.prototype.*方法可以被稱爲上陣列的情況下,而且似乎是這些實例的「方法」,而Array.*方法不能(至少不直接地),而是必須從Array對象本身調用。

例如:

[].concat([]) // calls Array.prototype.concat 
Array.concat([]) // undefined 

Array.isArray([]) // calls Array.isArray 
[].isArray([]) // undefined 
+1

好吧..他們可以在數組實例上調用(例如間接調用) - 每件事都可以調用。這只是沒有意義,因爲他們不使用'this'值。 –

+0

@BenjaminGruenbaum你是對的,更新。 –

相關問題