Krótka odpowiedź: __proto__
to odniesienie do prototype
właściwości konstruktora, który utworzył obiekt.
Obiekty w JavaScript
Obiekt JavaScript jest typem wbudowanym dla zbioru zawierającego zero lub więcej właściwości. Właściwości to kontenery zawierające inne obiekty, wartości pierwotne lub funkcje.
Konstruktory w JavaScript
Funkcje są zwykłymi obiektami (które implementują się [[Call]]
w terminach ECMA-262) z dodatkową możliwością wywoływania, ale odgrywają inną rolę w JavaScript: stają się konstruktorami ( fabrykami obiektów), jeśli zostaną wywołane przez new
operatora. Konstruktorzy są więc przybliżonym odpowiednikiem klas w innych językach.
Każda funkcja JavaScript jest w rzeczywistości instancją Function
wbudowanego obiektu funkcji, który ma specjalną właściwość o nazwie prototype
używaną do implementacji dziedziczenia opartego na prototypach i właściwości wspólnych. Każdy obiekt utworzony przez funkcję konstruktora ma niejawne odniesienie (zwane prototypem lub __proto__
) do wartości swojego konstruktora prototype
.
Konstruktor prototype
jest rodzajem planu budowania obiektów, ponieważ każdy obiekt utworzony przez konstruktora dziedziczy odniesienie do jego prototype
.
Łańcuch prototypów
Obiekt określa swój prototyp za pomocą właściwości wewnętrznej [[Prototype]]
lub __proto__
. Relacja prototypów między dwoma obiektami dotyczy dziedziczenia: każdy obiekt może mieć inny obiekt jako swój prototyp. Prototyp może być null
wartością.
Łańcuch obiektów połączonych __proto__
właściwością nazywany jest łańcuchem prototypów . Kiedy odwołuje się do właściwości obiektu, odnosi się ono do właściwości napotkanej w pierwszym obiekcie w łańcuchu prototypów, który zawiera właściwość o tej nazwie. Łańcuch prototypów zachowuje się tak, jakby był pojedynczym obiektem.
Zobacz ten obraz (pobrany z tego bloga ):
Za każdym razem, gdy próbujesz uzyskać dostęp do właściwości w obiekcie, JavaScript rozpoczyna wyszukiwanie jej w tym obiekcie i kontynuuje pracę ze swoim prototypem, prototypem prototypu i tak dalej, aż do napotkania właściwości lub jeśli __proto__
zachowa wartość null
.
Ten typ dziedziczenia przy użyciu łańcucha prototypów jest często nazywany delegacją, aby uniknąć nieporozumień z innymi językami używającymi łańcucha klas.
Prawie wszystkie obiekty są instancjami Object
, ponieważ Object.prototype
są ostatnim w łańcuchu prototypów. Ale Object.prototype
nie jest przykładem, Object
ponieważ Object.prototype.__proto__
ma wartość null
.
Możesz także stworzyć obiekt z null
prototypem takim jak ten:
var dict = Object.create(null);
Taki obiekt jest lepsze mapy (słownika) niż dosłownym obiektu, dlatego ten wzór jest czasami nazywany DICT wzór ( dict do słownika).
Uwaga: obiekty literalne utworzone za pomocą {}
są instancjami, Object
ponieważ ({}).__proto__
jest odwołaniem do Object.prototype
.