Próbuję pogodzić to stwierdzenie ze zrozumieniem, że prototyp jest nieruchomość odnoszące się do rodzaju macierzystego, ponieważ jest to w jaki sposób dziedziczenia został osiągnięty.
Nie. Prototypowa relacja do innego obiektu (z którego właściwości są dziedziczone) jest wykonywana za pomocą niewidocznego łącza, czasami oznaczanego jako [[prototype]]
.
Faktyczna, istniejąca właściwość .prototype
w funkcji konstruktora jest obiektem, z którego wszystkie wystąpienia skonstruowane przez tę funkcję będą dziedziczyć.
Więc prototyp (dziedziczenie) łańcuch obiektu Array wygląda następująco:
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]
Dlaczego niektóre metody mają .prototype a inne nie?
Funkcje dostępne w .prototype
będą dziedziczone przez wszystkie instancje, można je wywołać bezpośrednio na nich, jeśli są ich metodą.
Funkcje umieszczane bezpośrednio na funkcji konstruktora, takie jak Array.isArray
lub Array.of
, nie są związane z instancją i "statyczne". Nazywasz je głównie nie-tablicami jako argumentami.
Wszystkie funkcje mają właściwość '.prototype'. – Bergi
@Bergi o tym wiesz;)? (podpowiedź '.bind' i funkcje zdefiniowane przez środowisko hosta) –
@BenjaminGruenbaum: Ups, masz rację. Tylko natywne funkcje * konstruktora * i wszelkie obiekty funkcji utworzone przez użytkownika mają właściwość '.prototype'. Dzięki za heads-up! – Bergi