簡體   English   中英

為什么有些方法有.prototype而其他方法沒有?

[英]Why do some methods have .prototype and others don't?

關於prototype問題:為什么有些Array方法有.prototype而有些沒有?

JavaScript Array方法名稱截圖

文檔聲明“ 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.isArrayArray.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM