[英]Why some functions in JS have a prototype.constructor prop and others don’t? What is the difference between these functions?
[英]Why do some methods have .prototype and others don't?
關於prototype
問題:為什么有些Array方法有.prototype
而有些沒有?
文檔聲明“ Array.prototype
表示Array
構造函數的原型”。
我試圖調和這個陳述,理解prototype
是一個引用父類型的屬性,因為這就是繼承的實現方式。
如果是后者,那么什么是父型Array
誰“擁有”之類的方法map()
和indexOf()
我的主要問題是第一行的問題。
不在原型上的方法就像在其他一些語言中的“類”方法( 種類相似;相似性是膚淺的)。 原型上的方法可以從任何數組實例的上下文中調用; 直接在構造函數上的方法不是。
“length”屬性是每個數組實例的屬性; 在構造函數上也有一個“length”屬性,但它的意思完全不同 - 它告訴你函數中有多少形式參數(Array函數)。
Array的“父類型”,在JavaScript中這樣的事情是有意義的,是“對象”,但這與Array原型上的方法沒有任何關系。
我試圖調和這個陳述,理解原型是一個引用父類型的屬性,因為這就是繼承的實現方式。
否。與另一個對象(從中繼承屬性)的原型關系是通過一個不可見的鏈接完成的,有時表示為[[prototype]]
。
構造函數的實際現有.prototype
屬性是該對象構造的所有實例都將繼承的對象。
所以Array對象的原型(繼承)鏈看起來像這樣:
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
,不是與實例相關的,而是“靜態”的。 你主要用非數組作為參數調用它們。
Array.prototype.*
方法可以在數組實例上調用,並且看起來是這些實例的'方法',而Array.*
方法不能(至少不是直接),而是必須從Array
對象本身調用。
例如:
[].concat([]) // calls Array.prototype.concat
Array.concat([]) // undefined
Array.isArray([]) // calls Array.isArray
[].isArray([]) // undefined
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.