Jaka jest różnica między obiektami natywnymi a obiektami hosta?


90

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 ();)?


2
Obiekty natywne są zdefiniowane w specyfikacji ECMAScript, a obiekty hosta nie.
Šime Vidas

6
Na przykład element DOM - powiedzmy new Image()- jest obiektem hosta.

@ ŠimeVidas: Czy jest jakiś powód, dla którego zostawiłeś komentarz, który jest sprzeczny z twoją odpowiedzią?
user113716

@ Ӫ _._ Ӫ To moja sprawa:)
Šime Vidas

1
@ ŠimeVidas: Twój komentarz stwierdza, że obiekty hosta nie są zdefiniowane w specyfikacji ECMAScript . Twoja odpowiedź brzmi: „Definicje obu znajdują się w specyfikacji ECMAScript” .
user113716

Odpowiedzi:


133

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, ...


8
daj mu też kilka przykładów, obiekt natywny: Array, String .., host object: window ...
Poelinca Dorin

1
a co z niestandardowym custructorem? np. przykład ptaka w moim poście
ppecher

2
@ ŠimeVidas: "W takim razie jest to obiekt hosta." To nie jest poprawne. Zobacz definicję host objectopisaną w tej odpowiedzi .
user113716

1
ŠimeVidas: Jednak specyfikacja stwierdza, że „Wartość wewnętrznej właściwości [[Class]] obiektu hosta może być dowolną wartością typu String z wyjątkiem jednego z następujących elementów:„ Arguments ”,„ Array ”,„ Boolean ”,„ Date ”,„ Error ”, „Funkcja”, „JSON”, „Matematyka”, „Liczba”, „Obiekt” , „Wyrażenie regularne” i „Ciąg”. Wewnętrzna właściwość [[Class]] twojego obiektu Bird będzie 'Object', lub będzie prezentowana przez Object.prototype.toStringas '[object Object]'.
user113716

2
@ ŠimeVidas, nie zgadzam się, jeśli 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ź ...
Christian C. Salvadó

28

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.


Obiekty natywne odnoszą się do tych obiektów, które są tworzone przez implementację języka JavaScript (silnik). Różnica między obiektami wbudowanymi a innymi obiektami natywnymi (obiektami użytkownika) polega na tym, że poprzednie obiekty są obecne od początku działania programu javascript zgodnie z odpowiednimi regułami ECMA. Ponieważ ECMA6 (<ECMA6 ecma-international.org/publications/files/ECMA-ST/… ), nie używa powyższej terminologii do klasyfikowania obiektów. Zobacz moją odpowiedź poniżej.
jaaw

17

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.


2
+1, zgadzam się z tobą, 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 ...
Christian C. Salvadó

Dzięki @CMS. Tak, nie chciałem kłaść zbyt dużego nacisku na używanie wewnętrznego [[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?
user113716

Próbuję zobaczyć, jak to działa, ale jeśli otrzymam typ tego elementu div, divs/NodeListotrzymam plik object. Domyślam się, że jeszcze tego nie rozumiem, ale czy nie uczyniłoby to z tego rodzimego obiektu?
Mark B

To jest pomocne . Pobranie wszystkiego windowpokazuje wszystkie obiekty hosta
Mark B

Bird nie jest obiektem natywnym, ponieważ jego interfejs nie jest w pełni opisany w standardzie ECMASCript. To naprawdę takie proste. Object jest natywny, a String jest natywny, ale obiekty zdefiniowane przez użytkownika lub obiekty zdefiniowane przez hosta nie są natywne.
Scott Marcus,

3

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


3

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.

  1. Przykłady standardowych wbudowanych obiektów JavaScript :

  2. Przykłady modelu obiektu obiektu nadrzędnego :

  3. Obiekty hosta w Node.js :


1

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.


0

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:

  • natywny == "standardowy"
  • host == udostępniany przez przeglądarkę lub węzeł lub…
  • większość obiektów hosta jest natywna, a wszystkie obiekty inne niż host również są natywne

Trochę wypadłeś z torów. „Większość obiektów hosta jest rodzima” jest niepoprawne. W rzeczywistości z definicji WSZYSTKIE obiekty hosta NIE są natywne. Natywny oznacza na pewno „standardowy”, ale oznacza standard w specyfikacji języka, a nie standard w sensie niezwykłości. JavaScript (ECMASCript) definiuje kilka interfejsów / API, które są implementowane przez przeglądarki i inne hosty, takie jak: String, Date, MATH, Boolean, Number, JSON i XmlHTTP. Te obiekty są dostępne, ponieważ host implementuje silnik zgodny z ECMAScript i spełnia standard ECMA.
Scott Marcus

0

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.