Na poniższej wizualizacji
Istnieją dwa obiekty tablicowe (cars
& bikes
), które są tworzone przy użyciu poniższej składni,
var cars = new Array("Saab", "Volvo", "BMW"); var bikes = ["Honda", "Yamaha"];
którego [[Class]]
wartość właściwości to Array
.
Ponadto mamy również Array.prototype
, która jest w pełni funkcjonalną tablicą, ponieważ pokazane poniżej,
> Object.prototype.toString.call(Array.prototype); "[object Array]" > Array.prototype[0] = "Volvo"; "Volvo" > Array.prototype[1] = "BMW"; "BMW" > Array.prototype.length; 2
Ogólnie rzecz biorąc, gdy umieścisz coś na prototype
, każde wystąpienie obiektu będzie współużytkować te same właściwości.
Pytanie:
W przypadku właściwości length
jako członka, jaka jest idea Array.prototype
jest w pełni funkcjonalną tablicą?
Komentarze
Odpowiedź
Array-prototype sam w sobie jest w pełni funkcjonalną tablicą, ponieważ musi zawierać całą funkcjonalność, która jest niezbędna, aby obiekt działał jako tablica. Instancje Array dziedziczą całą swoją funkcjonalność po prototypie.
Zgodnie ze specyfikacją :
Prototypowy obiekt Array sam jest tablicą; jego [[Class]] to „Array” i ma właściwość length (której wartość początkowa to +0) oraz specjalną metodę wewnętrzną [[DefineOwnProperty]] opisaną w 15.4.5.1.
Komentarze
- Ale właściwość
length
jest właściwością na poziomie instancji. Każda instancja tablicy ma własną wartośćlength
. Dlaczego warto umieścić właściwośćlength
wArray.prototype
? Sensowne byłoby umieszczenie właściwościlength
w funkcji konstruktoraArray
. Po utworzeniu instancji każda instancja będzie miała własnąlength
właściwość określająca długość tablicy. Jednak właściwośćlength
funkcji konstruktoraArray
określa liczbę argumentów oczekiwaną przez funkcję konstruktora - @overexchange: obiekty nie nie dziedziczy właściwości z konstruktora, tylko z prototypu. Dlatego Array.length nie ma związku z Array.prototype.length.
- @JacquesB Oznacza to, że
length
jest wspólną właściwością między wszystkimi instancjami tablicy i jako Gdy tylko instancja zmieni swoją własną właściwośćlength
, ta wspólnalength
staje się cieniowana, a zatem bezużyteczna (ponieważ każda operacja arytmetyczna powoduje zacienienie występuje, np.x.length++
to w rzeczywistościx.length = x.length + 1
). Czy więc według ciebie jest to jedyne użycie tej właściwości, aby wszystkie instancje tablicy miały początkową właściwośćlength
? - Każdy obiekt tablicy ma
length
, która w żaden sposób nie pochodzi zArray.prototype.length
.Po prostu spróbuj ustawićArray.prototype[10] = 42
, co spowoduje, żeArray.prototype.length
będzie równe 11, ale oczywiście nowo utworzone tablice tego nie wychwytują. Dziedziczą element – spróbuj[][10]
. Niezbyt pożądane zachowanie. Niezależnie od przyczyny, dla której Array.prototype ma być tablicą,length
nie ma z tym nic wspólnego. - Dlaczego ' czy to jest zwykły obiekt z zaimplementowanymi wszystkimi właściwościami, takimi jak push itp., więc Array Instance dziedziczy po nim?
array
nie jest w pełni funkcjonalny? " I myślę, że odpowiedź na to pytanie jest oczywista: z tych samych powodów, dla których podzieliliście funkcjonalność klasy na klasę abstrakcyjną i klasę, która dziedziczy po it.Array.prototype
to coś więcej niżObject
? Bardziej w sensie ułatwienia przechowywania elementów.[42]
to w zasadzie to samo co{ "0": 42 }
, ale z innym prototypem i tym dziwacznymlength
właściwość.length
, która jest zwiększana dla każdej właściwości przechowywanej w obiekcie. W tym miejscu mówię, żeArray.prototype
to w pełni funkcjonalna tablica.