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ść
lengthjest właściwością na poziomie instancji. Każda instancja tablicy ma własną wartośćlength. Dlaczego warto umieścić właściwośćlengthwArray.prototype? Sensowne byłoby umieszczenie właściwościlengthw funkcji konstruktoraArray. Po utworzeniu instancji każda instancja będzie miała własnąlengthwłaściwość określająca długość tablicy. Jednak właściwośćlengthfunkcji konstruktoraArrayokreś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
lengthjest 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ólnalengthstaje 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.lengthbę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ą,lengthnie 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?
arraynie 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.prototypeto 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 dziwacznymlengthwłaściwość.length, która jest zwiększana dla każdej właściwości przechowywanej w obiekcie. W tym miejscu mówię, żeArray.prototypeto w pełni funkcjonalna tablica.