Krótka odpowiedź: __proto__to odniesienie do prototypewł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 newoperatora. Konstruktorzy są więc przybliżonym odpowiednikiem klas w innych językach.
Każda funkcja JavaScript jest w rzeczywistości instancją Functionwbudowanego obiektu funkcji, który ma specjalną właściwość o nazwie prototypeuż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 prototypejest 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ć nullwartoś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.prototypesą ostatnim w łańcuchu prototypów. Ale Object.prototypenie jest przykładem, Objectponieważ Object.prototype.__proto__ma wartość null.
Możesz także stworzyć obiekt z nullprototypem 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, Objectponieważ ({}).__proto__jest odwołaniem do Object.prototype.