關於prototype
的問題: 爲什麼某些數組方法有.prototype
而其他數不?爲什麼某些方法有.prototype和其他方法沒有?
的documentation狀態 「Array.prototype
代表的原型Array
構造」。
我試圖調和這個聲明,並理解prototype
是一個涉及父類型的屬性,因爲這是如何實現繼承。
如果後者爲真,那麼Array
誰擁有map()
和indexOf()
等方法的父類型是什麼?
我的主要問題是在第一行。
關於prototype
的問題: 爲什麼某些數組方法有.prototype
而其他數不?爲什麼某些方法有.prototype和其他方法沒有?
的documentation狀態 「Array.prototype
代表的原型Array
構造」。
我試圖調和這個聲明,並理解prototype
是一個涉及父類型的屬性,因爲這是如何實現繼承。
如果後者爲真,那麼Array
誰擁有map()
和indexOf()
等方法的父類型是什麼?
我的主要問題是在第一行。
我試圖調和的理解是原型是指父類型的屬性,因爲這是如何繼承實現了這一說法。
否。與另一個對象(從中繼承屬性)的原型關係通過不可見鏈接完成,有時表示爲[[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.isArray
或Array.of
)上的函數不是與實例相關的,也可以是「靜態」的。你主要用非數組作爲參數來調用它們。
不在原型上的方法類似於某些其他語言中的「類」方法(類型;相似性很膚淺)。原型上的方法可以從任何數組實例的上下文中調用;直接在構造函數上的方法不是。
「length」屬性是每個數組實例的屬性;在構造函數中也有一個「length」屬性,但它的含義完全不同,它告訴你函數中有多少形式參數(數組函數)。
Array的「父類型」,在JavaScript中有這種意義的地方是「Object」,但這與Array原型上的方法沒有任何關係。
的Array.prototype.*
方法可以被稱爲上陣列的情況下,而且似乎是這些實例的「方法」,而Array.*
方法不能(至少不直接地),而是必須從Array
對象本身調用。
例如:
[].concat([]) // calls Array.prototype.concat
Array.concat([]) // undefined
Array.isArray([]) // calls Array.isArray
[].isArray([]) // undefined
好吧..他們可以在數組實例上調用(例如間接調用) - 每件事都可以調用。這只是沒有意義,因爲他們不使用'this'值。 –
@BenjaminGruenbaum你是對的,更新。 –
所有函數都具有'.prototype'屬性。 – Bergi
@Bergi你是否確信;)? (提示'.bind'和主機環境定義的函數) –
@BenjaminGruenbaum:哎呀,你說得對。只有本機*構造函數*和任何用戶創建的函數對象才具有'.prototype'屬性。感謝您的提醒! – Bergi