Ten rysunek ponownie pokazuje, że każdy obiekt ma prototyp. Funkcja konstruktora Foo ma również swoją własną
__proto__
funkcję Function.prototype, która z kolei odwołuje się również poprzez swoją__proto__
właściwość do Object.prototype. Zatem powtórzmy, Foo.prototype jest tylko jawną właściwością Foo, która odnosi się do prototypu obiektów b i c.
var b = new Foo(20);
var c = new Foo(30);
Jakie są różnice między __proto__
i prototype
?
Liczba została zaczerpnięta z dmitrysoshnikov.com .
__proto__
różniconstructor.prototype
?Odpowiedzi:
__proto__
jest rzeczywistym obiektem używanym w łańcuchu wyszukiwania do rozwiązywania metod itp.prototype
jest obiektem używanym do budowania__proto__
podczas tworzenia obiektu za pomocąnew
:źródło
prototype
nie jest dostępny w samych instancjach (lub innych obiektach), ale tylko w funkcjach konstruktora.prototype
jest dostępny tylko na funkcjach, ponieważ pochodzą one zFunction
,Function
iObject
, ale w niczym innym nie. Jest jednak__proto__
dostępny wszędzie.__proto__
jest rzeczywisty obiekt, który jest zapisywany i używany jako prototyp, podczas gdyMyconstructure.prototype
jest tylko planem, dla__proto__
którego, w rzeczywistości jest faktyczny obiekt zapisany i używany jako prototyp. Stądmyobject.prototype
nie byłaby właściwością rzeczywistego obiektu, ponieważ jest to tylko tymczasowa rzecz używana przez funkcję konstruktora do nakreślenia, jakmyobject.__proto__
powinien wyglądać.__proto__
właściwość obiektu jest wskaźnikiem do właściwości funkcji konstruktoraprototype
obiektu? tj. foo .__ proto__ === foo.constructor.prototypenewCar.__proto__
ISCar.prototype
, a nie przypadekCar.prototype
. ChociażCar.protoype
jest instancjąobject
.Car.prototype
nie jest czymś, co dajenewCar
żadnych właściwości lub struktury, to po prostu JEST przyszłorocznegoobject
INnewCar
„s łańcuch prototypów.Car.prototype
nie jest tymczasowyobject
. Jest to wartość,object
która jest ustawiana jako wartość__proto__
właściwości każdego nowegoobject
s utworzonego przy użyciuCar
jakoconstructor
. Jeśli chcesz myśleć o czymś jako o planieobject
, pomyśl o tymCar
jak o schemacie dla nowych samochodówobject
.prototype
jest właściwością obiektu Function. Jest to prototyp obiektów skonstruowanych przez tę funkcję.__proto__
jest wewnętrzną własnością obiektu, wskazującą na jego prototyp. Obecne standardy zapewniają równoważnąObject.getPrototypeOf(O)
metodę, choć de facto standard__proto__
jest szybszy.Możesz znaleźć
instanceof
relacje, porównując funkcję z łańcuchemprototype
obiektu__proto__
, i możesz zerwać te relacje, zmieniającprototype
.Oto
Point
funkcja konstruktora, która konstruuje obiekt (strukturę danych) proceduralnie.myPoint
jest obiektem zbudowanym przez,Point()
więcPoint.prototype
zostajemyPoint.__proto__
w tym czasie zapisany .źródło
__proto__
właściwości obiektu powoduje zmianę obiektu, na którym wykonywane są wyszukiwania prototypów. Na przykład można dodać obiekt metod jako funkcję,__proto__
aby uzyskać rodzaj obiektu instancji, który można wywołać.console.log(obj1.call) // [Function: call]
obj1.call()
// TypeError: obj1.call nie jest funkcją. Zrobiłemobj.__proto__ = Function.__proto__
myFn.__proto__ = {foo: 'bar'}
Właściwość prototypowa jest tworzona, gdy funkcja jest deklarowana.
Na przykład:
Person.prototype
właściwość jest tworzona wewnętrznie po zadeklarowaniu powyższej funkcji. Do właściwości Person.prototype można dodać wiele właściwości, które są wspólne dla instancji Person utworzonych za pomocą nowej Person ().Warto zauważyć, że
Person.prototype
jest toObject
dosłownie domyślnie (można go zmienić w razie potrzeby).Każda instancja utworzona za pomocą
new Person()
ma__proto__
właściwość, która wskazuje naPerson.prototype
. Jest to łańcuch używany do przechodzenia w celu znalezienia właściwości określonego obiektu.tworzy 2 wystąpienia
Person
, te 2 obiekty mogą wywoływaćage
metodęPerson.prototype
asperson1.age
,person2.age
.Na powyższym obrazku z twojego pytania widać, że
Foo
jest toFunction Object
i dlatego ma__proto__
link do tego,Function.prototype
który z kolei jest instancjąObject
i ma__proto__
link doObject.prototype
. Końce tutaj z linkiem proto__proto__
wObject.prototype
wskazującąnull
.Każdy obiekt może mieć dostęp do wszystkich właściwości w swoim łańcuchu proto połączonych
__proto__
, tworząc w ten sposób podstawę dla dziedziczenia prototypowego.__proto__
nie jest standardowym sposobem uzyskiwania dostępu do łańcucha prototypów, należy zastosować standardowe, ale podobne podejścieObject.getPrototypeOf(obj)
.Poniższy kod dla
instanceof
operatora daje lepsze zrozumienie:instanceof
Operator klasy obiektu zwraca,true
gdy obiekt jest instancją klasy, a dokładniej, jeśliClass.prototype
zostanie znaleziony w łańcuchu proto tego obiektu, wówczas obiekt jest instancją tej klasy.Powyższą metodę można wywołać jako:
instanceOf.call(object, Class)
która zwraca true, jeśli obiekt jest instancją klasy.źródło
prototype
stworzony wewnętrznie? Czy można po prostu przypisać metody statyczne do samego obiektu funkcji. na przykładfunction f(a){this.a = a}; f.increment = function(){return ++this.a}
? Dlaczego nie wybrano tej metody zamiast dodawania metod doprototype
obiektu? Działa to, jeślif.__proto__ = g
g jest klasą podstawową.prototype
obiekt został wybrany do współużytkowania, ponieważ tylko wyłączne właściwości konstruktora funkcji mogą być przechowywane w obiekcie konstruktora funkcji.instanceof
spowodowałby({}) instanceof Function === true
brak możliwości rozróżnienia prototypów, jeśliprototype
właściwość zostanie usunięta.new
słowa kluczowego do utworzenia instancji, właściwości i metody nie zostaną skopiowane nad.Dobrym sposobem na myślenie o tym jest ...
prototype
jest używany przezconstructor()
funkcje. To naprawdę powinno było się nazywać coś takiego,"prototypeToInstall"
, ponieważ tak właśnie jest.i
__proto__
jest to „zainstalowany prototyp” na obiekcie (który został utworzony / zainstalowany na obiekcie z tejconstructor()
funkcji)źródło
constructor()
funkcje” na „funkcje konstruktora”, ponieważ może wystąpić pomyłka z „__proto__.constructor()
funkcjami”. Uważam to za ważne, ponieważ konstruktor __proto __ nie jest w rzeczywistości wywoływany, gdynew
używane jest słowo kluczowe.Aby to wyjaśnić, stwórzmy funkcję
Kiedy JavaScript wykonuje ten kod, dodaje
prototype
właściwośća
,prototype
właściwość jest obiektem z dwiema właściwościami:constructor
__proto__
Więc kiedy to zrobimy
a.prototype
powracaTeraz, jak widać,
constructor
jest tylkoa
sama funkcja i__proto__
wskazuje na główny poziomObject
JavaScript.Zobaczmy, co się stanie, gdy użyjemy
a
funkcji zenew
słowem kluczowym.Kiedy JavaScript wykonuje ten kod, robi 4 rzeczy:
__proto__
onb
i czyni to wskazywaća.prototype
zarzutówb.__proto__ === a.prototype
a.prototype.constructor
(co jest definicją funkcjia
) z nowo utworzonym obiektem (utworzonym w kroku 1) jako jego kontekst (ten), stądname
właściwość przekazana jako „JavaScript” (który jest dodawanythis
) zostaje dodana do nowo utworzonego obiektu.b
zostaje przypisany do nowo utworzonego obiektu.Teraz jeśli dodamy
a.prototype.car = "BMW"
i zrobimyb.car
, pojawi się wyjście „BMW”.dzieje się tak dlatego, że gdy JavaScript wykonał ten kod, w którym szukał
car
właściwościb
, nie znalazł wtedy JavaScript używanegob.__proto__
(który został stworzony, aby wskazywać na „a.prototyp” w kroku # 2) i znalazłcar
właściwość, więc zwróć „BMW”.źródło
constructor
nie wracaa()
! Powracaa
. 2.__proto__
zwracaObject.prototype
, a nie obiekt główny w JavaScript.Prototyp VS. __proto__ VS. [[Prototyp]]
Podczas tworzenia funkcji obiekt właściwości o nazwie prototyp jest tworzony automatycznie (sam go nie utworzyłeś) i jest dołączany do obiektu funkcji (the
constructor
).Uwaga : Ten nowy prototypowy obiekt wskazuje również lub ma wewnętrzny-prywatny link do natywnego obiektu JavaScript.
Przykład:
Jeśli tworzysz nowy obiekt za
Foo
pomocąnew
słowa kluczowego, zasadniczo tworzysz (między innymi) nowy obiekt, który ma wewnętrzny lub prywatny link doFoo
prototypu funkcji , o którym mówiliśmy wcześniej:Prywatny podnośnik do obiektu, który funkcję o nazwie podwójne wsporniki prototypów lub po prostu
[[Prototype]]
. Wiele przeglądarek zapewnia nam publiczny link do tego, który zadzwonił__proto__
!Mówiąc ściślej,
__proto__
to tak naprawdę funkcja pobierająca, która należy do natywnego obiektu JavaScript. Zwraca wewnętrzno-prywatne połączenie prototypowe dowolnegothis
powiązania (zwraca[[Prototype]]
zb
):Warto zauważyć, że od początku
ECMAScript5
można również użyć metody getPrototypeOf , aby uzyskać wewnętrzny prywatny link:UWAGA: ta odpowiedź nie zamierza obejmować cały proces tworzenia nowych obiektów lub nowych konstruktorów, lecz pomoc w lepszym zrozumieniu tego, co jest
__proto__
,prototype
a[[Prototype]]
i jak to działa.źródło
Aby wyjaśnić to nieco powyżej powyższych świetnych odpowiedzi:
Instancje mają __proto__ , klasy mają prototyp .
źródło
W JavaScript funkcja może być używana jako konstruktor. Oznacza to, że możemy tworzyć z nich obiekty za pomocą nowego słowa kluczowego. Każda funkcja konstruktora ma wbudowany z nimi powiązany obiekt. Ten wbudowany obiekt nazywa się prototypem.
Instances of a constructor function use __proto__ to access the prototype property of its constructor function.
Po pierwsze stworzyliśmy konstruktora:
function Foo(){}
. Żeby było jasne, Foo to kolejna funkcja. Ale możemy stworzyć z niego obiekt za pomocą nowego słowa kluczowego. Dlatego nazywamy to funkcją konstruktoraKażda funkcja ma unikalną właściwość, która nazywa się właściwością prototypową. Tak więc funkcja konstruktora
Foo
ma właściwość prototypu, która wskazuje na jej prototyp, którym jestFoo.prototype
(patrz zdjęcie).Funkcje konstruktora same w sobie są funkcją, która jest instancją konstruktora systemu zwanego konstruktorem [[Funkcja]]. Możemy więc powiedzieć, że
function Foo
jest konstruowany przez konstruktor [[Funkcja]]. Z__proto__
naszejFoo function
strony wskażemy prototyp jego konstruktora, którym jestFunction.prototype
.Function.prototype
sam w sobie jest niczym innym jak obiektem zbudowanym z innego konstruktora systemowego o nazwie[[Object]]
. Więc[[Object]]
jest konstruktoremFunction.prototype
. Możemy więc powiedzieć, żeFunction.prototype
jest to przypadek[[Object]]
. Więc__proto__
zFunction.prototype
punktówObject.prototype
.Object.prototype
jest ostatnim człowiekiem stojącym w łańcuchu prototypów. Mam na myśli, że nie został zbudowany. Jest już w systemie. Więc to__proto__
wskazuje nanull
.Teraz dochodzimy do przykładów
Foo
. Kiedy tworzymy instancję za pomocąnew Foo()
, tworzy nowy obiekt, który jest instancjąFoo
. Oznacza to, żeFoo
jest konstruktorem tych instancji. Tutaj stworzyliśmy dwa wystąpienia (x i y).__proto__
xiy wskazuje zatem naFoo.prototype
.źródło
Podsumowanie:
__proto__
Właściwość obiektu jest właściwością, która mapuje doprototype
funkcji konstruktora obiektu. Innymi słowy:instance.__proto__ === constructor.prototype // true
Służy to do tworzenia
prototype
łańcucha obiektu.prototype
Łańcucha odnośnika mechanizm właściwości dotyczących obiektu. W przypadku uzyskania dostępu do właściwości obiektu JavaScript najpierw sprawdzi obiekt. Jeśli nie ma tam nieruchomości, będzie się wspinać ażprotochain
do jej znalezienia (lub nie)Przykład:
Nasze pierwsze wyniki dziennika są
true
, ponieważ, jak wspomniano,__proto__
właściwość instancji utworzonej przez konstruktor odnosi się doprototype
właściwości konstruktora. Pamiętaj, że w JavaScript funkcje są również obiektami. Obiekty mogą mieć właściwości, a domyślną właściwością dowolnej funkcji jest jedna właściwość o nazwie prototyp.Następnie, gdy funkcja ta zostanie wykorzystana jako funkcja konstruktora, utworzony z niej obiekt otrzyma właściwość o nazwie
__proto__
. Ta__proto__
właściwość odnosi się doprototype
właściwości funkcji konstruktora (która domyślnie ma każda funkcja).Dlaczego to jest przydatne?
JavaScript ma mechanizm wyszukiwania właściwości, na
Objects
którym nazywa się „dziedziczenie prototypowe”. Oto, co robi w zasadzie:__proto__
właściwość. Tam sprawdza, czy właściwość jest dostępna dla obiektu, do którego odnosi się__proto__
.__proto__
obiekcie, będzie wspinać się po__proto__
łańcuchu aż doObject
obiektu.prototype
łańcuchu, zwróciundefined
.Na przykład:
źródło
Uczę się prototypu od You Don't Know JS: this & Object Prototypes , która jest wspaniałą książką do zrozumienia projektu poniżej i wyjaśnienia wielu nieporozumień (dlatego staram się unikać dziedziczenia i tym podobnych
instanceof
).Ale mam takie samo pytanie, jak ludzie tutaj zadawali. Kilka odpowiedzi jest naprawdę pomocnych i pouczających. Chciałbym również podzielić się swoimi zrozumieniami.
Co to jest prototyp?
Obiekty w JavaScript mają wewnętrzną właściwość, oznaczoną w specyfikacji jako
[[Prototype]]
, która jest po prostu odwołaniem do innego obiektu. Niemal wszystkie obiekty otrzymująnull
w tej chwili wartość dla tej właściwości.Jak zdobyć prototyp obiektu?
przez
__proto__
lubObject.getPrototypeOf
Co to jest
prototype
?prototype
to obiekt tworzony automatycznie jako specjalna właściwość funkcji , która służy do ustanowienia łańcucha delegowania (dziedziczenia), czyli łańcucha prototypów.Kiedy tworzymy funkcję
a
,prototype
jest ona automatycznie tworzona jako specjalna właściwośća
i zapisuje kod funkcji jakoconstructor
włączonyprototype
.Chciałbym rozważyć tę właściwość jako miejsce do przechowywania właściwości (w tym metod) obiektu funkcji. Z tego powodu funkcje narzędziowe w JS są zdefiniowane jako
Array.prototype.forEach()
:Function.prototype.bind()
,Object.prototype.toString().
Dlaczego warto podkreślać właściwość funkcji ?
Więc
Arary
,Function
,Object
są wszystkie funkcje. Muszę przyznać, że to odświeża moje wrażenie na JS. Wiem, że funkcje są pierwszorzędnym obywatelem w JS, ale wydaje się, że jest on zbudowany na funkcjach.Jaka jest różnica między
__proto__
iprototype
?__proto__
referencja działa na każdym obiekcie i odnosi się do jego[[Prototype]]
właściwości.prototype
to obiekt tworzony automatycznie jako specjalna właściwość funkcji , która służy do przechowywania właściwości (w tym metod) obiektu funkcji.Dzięki tym dwóm moglibyśmy mentalnie zmapować łańcuch prototypów. Jak to zdjęcie ilustruje:
źródło
W JavaScript każdy obiekt (funkcja też jest obiektem!) Ma
__proto__
właściwość, właściwość odnosi się do jej prototypu.Kiedy użyjemy
new
operatora z konstruktorem do utworzenia nowego obiektu, właściwość nowego obiektu__proto__
zostanie ustawiona za pomocąprototype
właściwości konstruktora , następnie konstruktor zostanie wywołany przez nowy obiekt, w tym procesie „to” będzie odwołaniem do nowego obiektu w zakresie konstruktora zwróć nowy obiekt.Prototyp Konstruktora jest
__proto__
własnością, własnością Konstruktoraprototype
jest praca znew
operatorem.Konstruktor musi być funkcją, ale funkcja nie zawsze jest konstruktorem, nawet jeśli ma
prototype
właściwość.Łańcuch prototypowy faktycznie jest
__proto__
właściwością obiektu, która odnosi się do jego prototypu, i właściwością prototypu,__proto__
która odnosi się do prototypu prototypu i tak dalej, aż do odniesienia do__proto__
właściwości prototypu Object, która jest wartością zerową.Na przykład:
[[Prototype]]
a__proto__
własność to właściwie to samo.Możemy użyć metody getPrototypeOf Objecta, aby uzyskać coś prototypu.
Każda napisana przez nas funkcja może być użyta do stworzenia obiektu za pomocą
new
operatora, więc każda z tych funkcji może być konstruktorem.źródło
Kolejny dobry sposób, aby to zrozumieć:
Dopiero po
__proto__
obsługiwaniu IE11 . Przed tą wersją, takich jak IE9, można użyćconstructor
, aby uzyskać__proto__
.źródło
prototyp
prototyp jest własnością funkcji. Jest to schemat tworzenia obiektów za pomocą tej funkcji (konstruktora) z nowym słowem kluczowym.
__proto__
jest używany w łańcuchu wyszukiwania do rozpoznawania metod i właściwości. gdy obiekt jest tworzony (przy użyciu funkcji konstruktora z nowym słowem kluczowym),__proto__
jest ustawiany na (Constructor) Function.prototypeOto moje (wyobrażone) wyjaśnienie, aby usunąć zamieszanie:
Wyobraź sobie, że istnieje wyimaginowana klasa (plan / kuter coockie) związana z funkcją. Ta wyobrażona klasa służy do tworzenia obiektów.
prototype
jest mechanizmem rozszerzenia (metoda rozszerzenia w C # lub Swift Extension) w celu dodania rzeczy do tej wyimaginowanej klasy.Powyższe można sobie wyobrazić jako:
Więc,
Teraz dodajemy metodę do
prototype
robota:Powyższe można sobie wyobrazić jako rozszerzenie klasy Robot:
Co z kolei
źródło
__proto__
i prototypach. może prototyp i dziedzictwo?prototype
i__proto__
należy unikać obu. Mamy teraz zajęcia i lubię OOP.Krótko mówiąc:
Pozwala to na dołączanie właściwości do X.prototypu PO utworzeniu instancji obiektów typu X i nadal będą one uzyskiwać dostęp do tych nowych właściwości za pomocą odwołania __proto__, którego silnik JavaScript używa do przejścia do łańcucha prototypów.
źródło
Prototyp lub Object.prototype jest właściwością literału obiektu. Reprezentuje obiekt prototypowy Object, który można przesłonić, aby dodać więcej właściwości lub metod dalej w łańcuchu prototypów.
__proto__ to właściwość akcesorium (funkcja get and set), która udostępnia wewnętrzny prototyp obiektu, do którego jest on dostępny.
Bibliografia:
http://www.w3schools.com/js/js_object_prototypes.asp
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/proto
źródło
Object.prototype
nie jest własnością literału obiektu, próbującego wydrukować{}.prototype
niezdefiniowane zwroty; można jednak uzyskać do niego dostęp za pośrednictwem{}.__proto__
, który zwracaObject.prototype
.Wiem, że się spóźniam, ale pozwól mi to uprościć.
Powiedzmy, że jest funkcja
Funkcja Foo będzie połączona z obiektem prototypowym. Tak więc, ilekroć tworzymy funkcję w JavaScript, zawsze łączy się z nią obiekt prototypowy.
Przejdźmy teraz do stworzenia dwóch obiektów za pomocą funkcji Foo.
Teraz Foo.prototype, a. proto , i b. proto all oznacza ten sam obiekt.
wszystkie powyższe zwróciłyby prawdę.
Jak wiemy, właściwości JavaScript można dodawać dynamicznie. Możemy dodać właściwość do obiektu
Jak widać dodaliśmy metodę Greet () w Foo.prototype, ale jest ona dostępna w aib lub w dowolnym innym obiekcie zbudowanym przy użyciu Foo.
Podczas wykonywania funkcji a.Greet () JavaScript najpierw przeszuka Pozdrowienie w obiekcie a na liście właściwości. Nie znajdując, przejdzie w górę w łańcuchu proto . Ponieważ. proto i Foo.prototype to ten sam obiekt, JavaScript znajdzie metodę Greet () i wykona ją.
Mam nadzieję, że teraz prototyp i proto są nieco uproszczone.
źródło
Przykład wyjaśniający:
teraz myPupppie ma
__proto__
właściwość, która wskazuje na Dog.prototype.ale myPuppie NIE ma właściwości prototypowej.
Tak więc,
__proto__
mypuppie to odwołanie do właściwości .prototype funkcji konstruktora, która została użyta do utworzenia tego obiektu (a bieżący obiekt myPuppie ma relację „deleguje się” do tego__proto__
obiektu), podczas gdy właściwość .prototype myPuppie jest po prostu nieobecna (ponieważ nie ustawiliśmy tego).Dobre wyjaśnienie MPJ tutaj: proto vs prototyp - Tworzenie obiektów w JavaScript
źródło
Zrobiłem dla siebie mały rysunek przedstawiający następujący fragment kodu:
Mam klasyczne tło OO, więc pomocne było reprezentowanie hierarchii w ten sposób. Aby pomóc Ci przeczytać ten diagram, traktuj prostokąty na obrazie jako obiekty JavaScript. I tak, funkcje są również obiektami. ;)
Obiekty w JavaScript mają właściwości i
__proto__
jest tylko jednym z nich.Ideą tej właściwości jest wskazanie obiektu przodka w hierarchii (dziedziczenia).
Obiektem głównym w JavaScript jest
Object.prototype
i wszystkie inne obiekty są potomkami tego obiektu.__proto__
Właściwości obiektu głównego jestnull
, co oznacza zakończenie łańcucha spadku.Zauważysz, że
prototype
jest to właściwość funkcji.Cat
jest funkcją, ale takżeFunction
iObject
są funkcjami (natywnymi).tom
nie jest funkcją, dlatego nie ma tej właściwości.Ideą tej właściwości jest wskazanie obiektu, który zostanie użyty w konstrukcji, tj. Kiedy wywołasz
new
operatora dla tej funkcji.Rzeczywiście, kiedy tworzymy
tom
obiekt za pomocąnew Cat()
, utworzony obiekt będzie miał__proto__
właściwość ustawioną naprototype
obiekt funkcji konstruktora.Na koniec zagrajmy trochę z tym diagramem. Następujące stwierdzenia są prawdziwe:
tom.__proto__
właściwość wskazuje na ten sam obiekt coCat.prototype
.Cat.__proto__
wskazuje naFunction.prototype
obiekt, podobnie jakFunction.__proto__
iObject.__proto__
zrobić.Cat.prototype.__proto__
itom.__proto__.__proto__
wskaż ten sam obiekt i to znaczyObject.prototype
.Twoje zdrowie!
źródło
tom.__proto__
iCat.prototype
są ściśle równe, więctom.__proto__ === Cat.prototype
iCat.prototype === tom.__proto__
są prawdziwe. Co masz na myśli przez strzałkę na obrazku?prototype
własnośćCat
obiektu (z twojego pytania).DEFINICJE
(liczba w nawiasie () to „link” do kodu napisanego poniżej)
prototype
- obiekt, który składa się z:=> funkcje (3) tego konkretnego
ConstructorFunction.prototype
(5), które są dostępne dla każdego obiektu (4) utworzonego lub utworzonego za pomocą tej funkcji konstruktora (1)=> samą funkcję konstruktora (1) )
=>
__proto__
tego konkretnego obiektu (obiekt prototypowy)__proto__
(dandor proto?) - łącze MIĘDZY dowolnym obiektem (2) utworzonym za pomocą określonej funkcji konstruktora (1) ORAZ właściwościami obiektu prototypu (5) tego konstruktora, KTÓRE umożliwiają każdemu utworzonemu obiektowi (2) dostęp do funkcji prototypu i metody (4) (__proto__
domyślnie są zawarte w każdym obiekcie w JS)WYJAŚNIENIE KODU
1.
2)
3)
4
5
źródło
Spróbuję wyjaśnienia czwartej klasy:
Rzeczy są bardzo proste. A
prototype
jest przykładem tego, jak należy coś zbudować. Więc:Jestem
function
i buduję nowe obiekty podobne do moichprototype
Jestem
object
i zostałem zbudowany na moim__proto__
przykładziedowód :
źródło
prototype
ani nie__proto__
są używane w dowolnym momencie jako plan do stworzenia dowolnego obiektu. To mit wprowadzony przez rozmytąclass
składnię i jej poprzedników. Jak mówi post z odpowiedzią, jest on po prostu używany w łańcuchu wyszukiwania iw przypadkuprototype
identyfikacjiconstructor
używanynew
(który jest częścią tego mechanizmu udawania, że ma klasę, co dezorientuje wielu użytkowników, w tym mnie).Każda tworzona funkcja ma właściwość o nazwie
prototype
i zaczyna życie jako pusty obiekt. Ta właściwość nie ma zastosowania, dopóki nie użyjesz tej funkcji jako funkcji konstruktora, tj. Ze słowem kluczowym „new”.Jest to często mylone z
__proto__
właściwością obiektu. Niektórzy mogą się pomylić i poza tym, żeprototype
właściwość obiektu może uzyskać proto obiektu. Ale tak nie jest.prototype
służy do uzyskania__proto__
obiektu utworzonego z konstruktora funkcji.W powyższym przykładzie:
Mam nadzieję, że to ma sens.
źródło
prototype
nie jest używany do tworzenia__proto__
obiektu.__proto__
, po uzyskaniu dostępu, stanowi jedynie odniesienie doprototype
obiektu.Co z użyciem
__proto__
metod statycznych?źródło
__proto__
VS.prototype
w JavaScript” ?Wypróbuj ten kod, aby zrozumieć
źródło
Jest tylko jeden obiekt, który jest używany do łączenia łańcuchowego. Ten obiekt ma oczywiście nazwę i wartość:
__proto__
jest jego nazwą iprototype
wartością. To wszystko.aby jeszcze łatwiej zrozumieć, spójrz na diagram na górze tego postu (Diagram autorstwa Dmitrija Soshnikova), nigdy nie znajdziesz
__proto__
punktów do czegoś innego niżprototype
jako jego wartość.Istota jest taka:
__proto__
to nazwa, która odwołuje się do obiektu prototypowego iprototype
jest rzeczywistym obiektem prototypowym.To tak, jakby powiedzieć:
x
jest nazwą obiektu (wskaźnikiem) i{name: 'john'}
jest rzeczywistym obiektem (wartością danych).UWAGA: to tylko ogromnie uproszczona wskazówka, w jaki sposób są one powiązane na wysokim poziomie.
Aktualizacja: Oto prosty konkretny przykład javascript dla lepszej ilustracji:
Oznacza to, że gdy
Object.getPrototypeOf(x)
dostaje nam rzeczywistą wartośćx
(co jest jego prototyp) jest dokładnie to, co__proto__
odx
wskazuje. Dlatego__proto__
rzeczywiście wskazuje na prototypx
. Zatem__proto__
referencjex
(wskaźnikx
) iprototype
jest wartościąx
(jego prototypu).Mam nadzieję, że teraz jest to trochę jasne.
źródło
To bardzo ważne pytanie istotne dla każdego, kto chce zrozumieć dziedzictwo prototypowe. Z tego, co rozumiem, prototyp jest domyślnie przypisywany, gdy obiekt jest tworzony przy użyciu nowego z funkcji, ponieważ funkcja ma obiekt prototypowy z definicji:
Kiedy tworzymy zwykły obiekt bez nowego, tzn. Jawnie z funkcji, nie ma on prototypu, ale ma pusty proto, któremu można przypisać prototyp.
Możemy użyć Object.create do jawnego połączenia obiektu.
źródło
__proto__
jest podstawą do skonstruowaniaprototype
i funkcją konstruktora, np .:function human(){}
has,prototype
która jest współdzielona__proto__
w nowej instancji funkcji konstruktora. Bardziej szczegółowe przeczytaj tutajźródło
Jak to słusznie stwierdzono
Możemy ponadto zauważyć, że
__proto__
właściwość obiektu utworzonego za pomocą konstruktora funkcji wskazuje na lokalizację pamięci wskazywaną przez prototyp właściwość tego odpowiedniego konstruktora.Jeśli zmienimy lokalizację pamięci prototypu funkcji konstruktora,
__proto__
obiekt pochodny będzie nadal wskazywał na pierwotną przestrzeń adresową. Dlatego, aby udostępnić wspólną właściwość w łańcuchu dziedziczenia, zawsze dołączaj właściwość do prototypu funkcji konstruktora , zamiast go ponownie inicjować (co zmieniłoby jego adres pamięci).Rozważ następujący przykład:
źródło
rozumiem: __proto__ i prototyp są obsługiwane dla techniki łańcucha prototypów. różnica polega na tym, że funkcje o nazwie z podkreśleniem (jak __proto__) nie są przeznaczone dla programistów wywoływanych w ogóle. innymi słowy, są one tylko dla niektórych mechanizmów, takich jak dziedziczenie itp., są „zapleczem”. ale funkcje nazwane bez podkreślenia są zaprojektowane do jawnego wywoływania, są one „front-end”.
źródło
__proto__
iprototype
, niż tylko konwencji nazewnictwa. Mogą, ale nie muszą, wskazywać na ten sam obiekt. Zobacz odpowiedź @zyklus.!!! TO NAJLEPSZE WYJAŚNIENIE NA ŚWIECIE !!!!!
w konstruktorach funkcji silnik javascript wywołuje to
q.__proto__ = prototype
automatycznie podczas pisanianew Class
, a także do__proto__
zestawu propClass.prototype
Cieszyć się %)
źródło