Dlaczego Array.prototype zaprojektowano jako w pełni funkcjonalną tablicę?

Na poniższej wizualizacji

wprowadź opis obrazu tutaj

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

  • Rozumiem, że < obiekt > .pr ototyp jest zawsze obiektem, ponieważ celem prototypu jest to, że ' jest mapą od nazw metod do rzeczywistych metod współdzielonych przez kilka różnych obiektów. Fakt, że Array.prototype jest również tablicą, wiąże się z faktem, że wszystkie tablice są obiektami specjalnymi. Pytasz, dlaczego Array.prototype jest tablicą, a nie zwykłym obiektem? Albo dlaczego prototypy JS nie są ograniczone do mapowania funkcji typu string – >? Albo dlaczego tablice JS są specjalnymi obiektami? Czy coś innego?
  • Ty ' prawdopodobnie zadajesz niewłaściwe pytanie. Właściwe pytanie brzmi: " dlaczego nie ' t 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.
  • @Ixrec Dlaczego Array.prototype to coś więcej niż Object? Bardziej w sensie ułatwienia przechowywania elementów.
  • @overexchange Ale obiekty również przechowują elementy. Jeśli masz na myśli przechowywanie elementów z kluczami całkowitymi, tablice nie ' również tego nie robią, ponieważ tablice są obiektami. Klucze liczb całkowitych zawsze są konwertowane na ciągi (ponieważ JavaScript jest trochę dziwny). [42] to w zasadzie to samo co { "0": 42 }, ale z innym prototypem i tym dziwacznym length właściwość.
  • @Ixrec Ale nie wszystkie obiekty mają właściwość length, która jest zwiększana dla każdej właściwości przechowywanej w obiekcie. W tym miejscu mówię, że Array.prototype to w pełni funkcjonalna tablica.

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 w Array.prototype? Sensowne byłoby umieszczenie właściwości length w funkcji konstruktora Array. 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 konstruktora Array 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ólna length staje się cieniowana, a zatem bezużyteczna (ponieważ każda operacja arytmetyczna powoduje zacienienie występuje, np. x.length++ to w rzeczywistości x.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 z Array.prototype.length.Po prostu spróbuj ustawić Array.prototype[10] = 42, co spowoduje, że Array.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?

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *