Czy to ostatnie odnosi się po prostu do niepierwotnych obiektów funkcji, które zostały utworzone przez niestandardowego konstruktora (np. Var bird1 = new Bird ();)?
:)
Czy to ostatnie odnosi się po prostu do niepierwotnych obiektów funkcji, które zostały utworzone przez niestandardowego konstruktora (np. Var bird1 = new Bird ();)?
:)
Odpowiedzi:
Oba terminy są zdefiniowane w specyfikacji ECMAScript:
obiekt macierzysty
obiekt w implementacji ECMAScript, którego semantyka jest w pełni zdefiniowana przez tę specyfikację, a nie przez środowisko hosta.
UWAGA Standardowe obiekty natywne są zdefiniowane w tej specyfikacji. Niektóre obiekty natywne są wbudowane; inne mogą być konstruowane w trakcie wykonywania programu ECMAScript.
Źródło: http://es5.github.com/#x4.3.6
obiekt hosta
obiekt dostarczony przez środowisko hosta, aby uzupełnić środowisko wykonawcze ECMAScript.
UWAGA Każdy obiekt, który nie jest rodzimy, jest obiektem hosta.
Źródło: http://es5.github.com/#x4.3.8
Kilka przykładów:
Natywne obiekty: Object(konstruktora), Date, Math, parseInt, eval, metody ciąg jak indexOfi replace, metody array, ...
Obiekty gospodarza (zakładając środowisku przeglądarki): window, document, location, history, XMLHttpRequest, setTimeout, getElementsByTagName, querySelectorAll, ...
host objectopisaną w tej odpowiedzi .
'Object', lub będzie prezentowana przez Object.prototype.toStringas '[object Object]'.
Birdjest to funkcja zdefiniowana przez użytkownika, jej semantyka jest „w pełni zdefiniowana” przez specyfikację ES (jak działają obiekty funkcji, jak są tworzone, wykonywane, używane z newoperatorem itp., Itd.) rodzimy obiekt ... Mogę zostawić odpowiedź ...
Jest bardziej jasne, jeśli rozróżnimy trzy rodzaje obiektów:
Wbudowanych obiektów : String, Math, RegExp, Object, Functionitd. - podstawowe predefiniowane obiekty zawsze dostępna w języku JavaScript. Zdefiniowane w specyfikacji ECMAScript.
Obiekty Host : Przedmioty takie jak window, XmlHttpRequest, węzłów DOM i tak dalej, które są świadczone przez środowisko przeglądarki. Różnią się one od obiektów wbudowanych, ponieważ nie wszystkie środowiska będą miały te same obiekty hosta. Jeśli JavaScript działa poza przeglądarką, na przykład jako język skryptowy po stronie serwera, jak w Node.js, dostępne będą różne obiekty hosta.
Obiekty użytkownika : obiekty zdefiniowane w kodzie JavaScript. Zatem „Ptak” w twoim przykładzie byłby obiektem użytkownika.
Specyfikacja JavaScript grupuje wbudowane obiekty i obiekty użytkowników razem jako obiekty natywne . Jest to niekonwencjonalne użycie terminu „natywny”, ponieważ obiekty użytkownika są oczywiście zaimplementowane w JavaScript, podczas gdy wbudowane są najprawdopodobniej zaimplementowane w innym języku, tak jak byłyby to obiekty hosta. Ale z punktu widzenia specyfikacji JavaScript, zarówno obiekty wbudowane, jak i obiekty użytkownika są natywne dla JavaScript, ponieważ są zdefiniowane w specyfikacji JavaScript, podczas gdy obiekty hosta nie.
Oto moje zrozumienie specyfikacji.
To:
var bird = new Bird();
... powoduje powstanie natywnego obiektu, który po prostu został utworzony przy użyciu newoperatora.
Obiekty natywne mają wewnętrzną właściwość [[Class]] jednej z następujących właściwości:
„Argumenty”, „Tablica”, „Wartość logiczna”, „Data”, „Błąd”, „Funkcja”, „JSON”, „Matematyka”, „Liczba”, „Obiekt”, „Wyrażenie regularne” i „Ciąg” .
Dla Ciebie bird1będzie to:
"Obiekt"
Podobnie jak w przypadku tworzenia funkcji:
function my_func() {
// ...
}
... my_funcnie jest zdefiniowany w ECMAScript, ale nadal jest to obiekt natywny z wewnętrznym [[Class]]:
"Funkcjonować"
Obiekt hosta to obiekt dostarczony przez środowisko w celu spełnienia określonego celu w tym środowisku, który nie jest zdefiniowany w specyfikacji.
Na przykład:
var divs = document.getElementsByTagName('div')
Obiekt, do którego się odwołuje, divsto NodeList , który jest zintegrowany ze środowiskiem w taki sposób, że wygląda jak zwykły obiekt JavaScript, ale nie jest nigdzie zdefiniowany w specyfikacji.
Jego wewnętrzna właściwość [[Klasa]] to:
„NodeList”
Zapewnia to projektantom wdrożeń pewną elastyczność w dostosowaniu implementacji do konkretnych potrzeb środowiska.
Istnieją wymagania dotyczące obiektów hosta, które są zdefiniowane w specyfikacji.
birdi Birdsą to obiekty natywne , są to funkcja zdefiniowana przez użytkownika ( Bird) i obiekt ( bird) utworzony przez użycie funkcji jako konstruktora, cała semantyka tego jest zdefiniowana w specyfikacji. Jeśli chodzi o obiekty hosta, nie polegaj zbytnio na [[Class]]własności wewnętrznej, na przykład window.alertma "Function"jako wartość swojej [[Class]]właściwości prawie wszystkie implementacje, na IE ma "Object"i nadal jest obiektem hosta ...
[[Class]]. Zamiast tego użyć go jako namacalnego spojrzenia na to, jak realizatorzy zinterpretowali różne typy obiektów. Zatem window.alertposiadanie wewnętrznego [[Class]]of "Function"wydawałoby się naruszeniem ES 5?
divs/NodeListotrzymam plik object. Domyślam się, że jeszcze tego nie rozumiem, ale czy nie uczyniłoby to z tego rodzimego obiektu?
windowpokazuje wszystkie obiekty hosta
Nie udało się znaleźć przekonującej odpowiedzi na pytanie, czy var bird1 = new Bird();jest to obiekt macierzysty czy host. Zakładając, że Bird jest funkcją zdefiniowaną przez użytkownika, natywny niewbudowany obiekt zostanie utworzony zgodnie z http://es5.github.io/#x13.2 przez implementację javascript. W przeciwieństwie do tego natywny wbudowanyobiekty będą obecne od początku programu javascript (takiego jak Object i wiele innych). Różnica między obiektem natywnym a obiektem hosta polega na tym, że pierwszy jest tworzony przez implementację javascript, a drugi jest udostępniany przez środowisko hosta. W rezultacie wewnętrzna właściwość [[klasa]] obiektu hosta może różnić się od właściwości używanych przez obiekty wbudowane (np. „Argumenty”, „Tablica”, „Boolean”, „Data”, „Błąd”, „Funkcja”, „ JSON ”,„ Math ”,„ Number ”,„ Object ”,„ RegExp ”i„ String ”).
Warto również zauważyć, że http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf ECMA6 nie używa już terminologii obiektów macierzystych i hosta. Zamiast tego definiuje poniżej typy obiektów, z bardziej jasnymi wyjaśnieniami ich zamierzonego zachowania.
4.3.6 zwykły przedmiot
obiekt, który ma domyślne zachowanie dla podstawowych metod wewnętrznych, które muszą być obsługiwane przez wszystkie obiekty
4.3.7 obiekt egzotyczny
obiekt, który nie ma zachowania domyślnego dla jednej lub więcej podstawowych metod wewnętrznych, które muszą być obsługiwane przez wszystkie obiekty. UWAGA Każdy obiekt, który nie jest zwykłym obiektem, jest obiektem egzotycznym.
4.3.8 obiekt standardowy
obiekt, którego semantyka jest zdefiniowana w tej specyfikacji
4.3.9 obiekt wbudowany
obiekt określony i dostarczony przez implementację ECMAScript
Oprócz innych odpowiedzi dotyczących obiektów hosta.
Obiekty hosta są specyficzne dla środowiska. Więc obok obiektów hosta przeglądarki są również określone obiekty dla nodejs.
Na potrzeby przykładu, najpierw zacznij od obiektów Standard, zgodnie z definicją w JavaScript. Następnie wspólne obiekty dla przeglądarki / DOM. Węzeł ma swoje własne obiekty.
Przykłady standardowych wbudowanych obiektów JavaScript :
Przykłady modelu obiektu obiektu nadrzędnego :
Obiekty hosta w Node.js :
Biorąc pod uwagę trzy obiekty: Host, Native, Custom.
Obiekty nadrzędne są tworzone przez środowisko i są specyficzne dla środowiska. Najbardziej znanym środowiskiem byłaby przeglądarka internetowa, ale mogłaby to być inna platforma. Obiekty hosta utworzone w przeglądarce internetowej mogą być obiektem okna lub dokumentem. Zazwyczaj przeglądarka używa interfejsu API do tworzenia obiektów hosta w celu odzwierciedlenia modelu obiektu dokumentu w języku JavaScript. (Przeglądarka internetowa ma różne silniki JavaScript, które to robią) Obiekt hosta jest tworzony automatycznie w momencie renderowania strony w przeglądarce.
Obiekt macierzysty jest tworzony przez programistę przy użyciu predefiniowanych klas JavaScript. Obiekty natywne są w twoim scenariuszu.
Następnie obiekt niestandardowy jest tworzony przez programistę z niestandardowej (niezdefiniowanej lub częściowo wstępnie zdefiniowanej) klasy.
Obiekty natywne to obiekty zgodne ze specyfikacją, tj. „Obiekty standardowe”.
Obiekty hosta to obiekty udostępniane przez przeglądarkę (lub inne środowisko wykonawcze, takie jak Node).
Większość obiektów hosta to obiekty natywne, a za każdym razem, gdy tworzysz instancję przy użyciu new, możesz być na 99,99% pewien, że jest to obiekt natywny, chyba że będziesz bawić się dziwnymi obiektami hosta.
Pojęcie to zostało wprowadzone ze względu na obecność bardzo dziwacznych obiektów w IE (i innych starych przeglądarkach?) . Na przykład:
typeof document.all == "undefined"; // true
document.all.myElementId; // object
Po obejrzeniu tego, każdy zgodzi się, że document.alljest wyraźnie „non-standard”, a tym samym nie rodzimy obiekt gospodarzem.
Dlaczego więc w pierwszej kolejności nie wywołać standardowych obiektów natywnych ? Proste: w końcu dokument Standard (!) Mówi również o obiektach obcych, a nazywanie ich niestandardowymi prowadziłoby do paradoksu.
Jeszcze raz:
Może to być przesada, ale dla uproszczenia obiekt natywny to taki, który istnieje i nadaje się do użytku w każdym środowisku, które implementuje silnik zgodny z ECMAScript. Zwykle (ale nie zawsze) jest to przeglądarka.
Na przykład Twój Internet Explorer lub Google Chrome nie udostępnia Ci obiektu String. Powodem, dla którego możesz użyć obiektu String, jest to, że jest on „rodzimy” (wbudowany) w sam język JavaScript.
Jeśli jednak chcesz utworzyć wyskakujące okienko, musisz użyć obiektu window. Obiekt okna jest dostarczany przez samo oprogramowanie przeglądarki, więc nie jest natywny dla JavaScript, ale jest częścią „Browser Object Model” lub BOM.