Was ist der Unterschied zwischen nativen Objekten und Hostobjekten?

89

Bezieht sich letzteres einfach auf nichtprimitive Funktionsobjekte, die von einem benutzerdefinierten Konstruktor erstellt wurden (z. B. var bird1 = new Bird ();)?

ppecher
quelle
2
Native Objekte sind in der ECMAScript-Spezifikation definiert, Hostobjekte nicht.
Šime Vidas
6
Ein DOM-Element - beispielsweise new Image()- ist beispielsweise ein Host-Objekt.
@ ŠimeVidas: Gibt es einen Grund, warum Sie einen Kommentar hinterlassen haben, der Ihrer Antwort widerspricht?
user113716
@ Ӫ _._ Ӫ Das ist jetzt mein Ding:)
Šime Vidas
1
@ ŠimeVidas: Ihr Kommentar besagt, dass Hostobjekte nicht in der ECMAScript-Spezifikation definiert sind . Ihre Antwort lautet "Die Definitionen für beide befinden sich in der ECMAScript-Spezifikation" .
user113716

Antworten:

132

Beide Begriffe sind in der ECMAScript-Spezifikation definiert:

natives Objekt

Objekt in einer ECMAScript-Implementierung, deren Semantik vollständig durch diese Spezifikation und nicht durch die Hostumgebung definiert wird.

HINWEIS In dieser Spezifikation sind native Standardobjekte definiert. Einige native Objekte sind integriert. andere können während der Ausführung eines ECMAScript-Programms erstellt werden.

Quelle: http://es5.github.com/#x4.3.6

Host-Objekt

Objekt, das von der Host-Umgebung bereitgestellt wird, um die Ausführungsumgebung von ECMAScript zu vervollständigen.

HINWEIS Jedes Objekt, das nicht nativ ist, ist ein Hostobjekt.

Quelle: http://es5.github.com/#x4.3.8


Einige Beispiele:

Native Objekte: Object(Konstruktor) Date, Math, parseInt, eval, String - Methoden wie indexOfund replaceArray - Methoden, ...

Host - Objekte (Browserumgebung vorausgesetzt): window, document, location, history, XMLHttpRequest, setTimeout, getElementsByTagName, querySelectorAll, ...

Šime Vidas
quelle
8
Geben Sie ihm auch einige Beispiele, natives Objekt: Array, String .., Host-Objekt: Fenster ...
Poelinca Dorin
1
Was ist mit einem Custom Custructor? zB das Vogelbeispiel in meinem Post
Ppecher
2
@ ŠimeVidas: "Dann ist es ein Host-Objekt." Das stimmt nicht Siehe die in dieser Antworthost object beschriebene Definition von .
user113716
1
ŠimeVidas: In der Spezifikation heißt es jedoch: 'Der Wert der internen Eigenschaft [[Class]] eines Host-Objekts kann ein beliebiger String-Wert sein, mit Ausnahme von "Arguments", "Array", "Boolean", "Date", "Error", "Function", "JSON", "Math", "Number", "Object" , "RegExp" und "String". ' Die interne [[Klasse]] Eigenschaft Ihres Vogel Objekt wird 'Object', oder über präsentiert Object.prototype.toStringwie '[object Object]'.
user113716
2
@ ŠimeVidas, ich bin anderer Meinung, wenn Birdes sich um eine benutzerdefinierte Funktion handelt, wird ihre Semantik durch die ES-Spezifikation "vollständig definiert" (wie Funktionsobjekte funktionieren, wie sie erstellt, ausgeführt, mit dem newOperator verwendet usw. usw. usw.) natives Objekt ... Ich könnte eine Antwort fallen lassen ...
CMS
28

Es ist klarer, wenn wir zwischen drei Arten von Objekten unterscheiden:

Built-in - Objekte : String, Math, RegExp, Object, Functionusw. - Kern vordefinierte Objekte in JavaScript immer verfügbar. In der ECMAScript-Spezifikation definiert.

Host - Objekte : Objekte wie window, XmlHttpRequest, DOM - Knoten und so weiter, die von der Browser - Umgebung zur Verfügung gestellt wird. Sie unterscheiden sich von den integrierten Objekten, da nicht alle Umgebungen dieselben Hostobjekte haben. Wenn JavaScript außerhalb des Browsers ausgeführt wird, z. B. als serverseitige Skriptsprache wie in Node.js, sind verschiedene Hostobjekte verfügbar.

Benutzerobjekte : Objekte, die im JavaScript-Code definiert sind. In Ihrem Beispiel wäre "Vogel" also ein Benutzerobjekt.

Die JavaScript-Spezifikation gruppiert integrierte Objekte und Benutzerobjekte als native Objekte . Dies ist eine unorthodoxe Verwendung des Begriffs "native", da Benutzerobjekte offensichtlich in JavaScript implementiert sind, während die integrierten Objekte höchstwahrscheinlich in einer anderen Sprache unter der Haube implementiert sind, genau wie die Hostobjekte. Aus Sicht der JavaScript-Spezifikation sind sowohl integrierte als auch Benutzerobjekte in JavaScript integriert, da sie in der JavaScript-Spezifikation definiert sind, Hostobjekte jedoch nicht.

JacquesB
quelle
Native Objekte beziehen sich auf Objekte, die von der Javascript-Implementierung (Engine) erstellt werden. Der Unterschied zwischen integrierten und anderen nativen Objekten (Benutzerobjekten) besteht darin, dass frühere Objekte seit dem Start des Javascript-Programms vorhanden sind, das den relevanten ECMA-Regeln entspricht. Seit ECMA6 (<ECMA6 ecma-international.org/publications/files/ECMA-ST/… ) wird die obige Terminologie nicht zur Klassifizierung von Objekten verwendet. Siehe meine Antwort unten.
Jaaw
17

Hier ist mein Verständnis der Spezifikation.

Dies:

var bird = new Bird();

... führt zu einem nativen Objekt, das einfach mit dem newOperator erstellt wurde.

Native Objekte haben eine interne [[Klasse]] Eigenschaft von einer der folgenden Eigenschaften:

"Argumente", "Array", "Boolescher Wert", "Datum", "Fehler", "Funktion", "JSON", "Mathematik", "Zahl", "Objekt", "RegExp" und "Zeichenfolge" .

Für bird1Sie wird es sein:

"Objekt"

Genau wie beim Erstellen einer Funktion:

function my_func() {
    // ...
}

... my_funcist in ECMAScript nicht definiert, aber es ist immer noch ein natives Objekt mit der internen [[Klasse]]:

"Funktion"

Ein Hostobjekt ist ein Objekt, das von der Umgebung bereitgestellt wird, um einen bestimmten Zweck für diese Umgebung zu erfüllen, die nicht in der Spezifikation definiert ist.

Beispielsweise:

var divs = document.getElementsByTagName('div')

Das Objekt, auf das verwiesen wird, divsist eine NodeList , die so in die Umgebung integriert ist, dass sie sich wie ein normales JavaScript-Objekt anfühlt, jedoch nirgendwo in der Spezifikation definiert ist.

Seine interne [[Klasse]] Eigenschaft ist:

"NodeList"

Dies bietet Implementierungsdesignern eine gewisse Flexibilität bei der Anpassung der Implementierung an die spezifischen Anforderungen der Umgebung.

Es gibt Anforderungen an Hostobjekte , die in der gesamten Spezifikation definiert sind.

user113716
quelle
2
+1, ich stimme Ihnen zu birdund Birdsind native Objekte , sie sind eine benutzerdefinierte Funktion ( Bird) und ein Objekt ( bird), das durch die Verwendung der Funktion als Konstruktor erstellt wurde. Die gesamte Semantik hierfür ist in der Spezifikation definiert. Verlassen Sie sich bei Hostobjekten nicht zu sehr auf die [[Class]]interne Eigenschaft, zum Beispiel window.alerthat sie "Function"als Wert [[Class]]fast alle Implementierungen als Wert für ihre Eigenschaft "Object", und sie ist immer noch ein Hostobjekt ...
CMS
Danke @CMS. Ja, ich wollte nicht zu viel Wert auf die Verwendung des Internen legen [[Class]]. Eher nur, um einen konkreten Einblick in die Interpretation der verschiedenen Objekttypen durch die Implementierer zu erhalten. So dann window.alertmit einer Innen [[Class]]von "Function"scheint eine Verletzung von IHM 5 zu sein?
user113716
Ich versuche, diese Aktion zu sehen, aber wenn ich den Typ dieses Divs divs/NodeListbekomme, bekomme ich einen object. Ich schätze, ich verstehe das noch nicht, aber würde das es nicht zu einem nativen Objekt machen?
Mark B
Das ist hilfreich . Wenn Sie alles windoweingeben, werden alle Host-Objekte
Mark B,
Bird ist kein natives Objekt, da seine Schnittstelle im ECMASCript-Standard nicht vollständig beschrieben ist. So einfach ist das wirklich. Das Objekt ist nativ und der String ist nativ, aber benutzerdefinierte oder vom Host definierte Objekte sind nicht nativ.
Scott Marcus
3

Es konnte keine überzeugende Antwort auf die Frage gefunden werden, ob var bird1 = new Bird();es sich um ein natives oder ein Host-Objekt handelt. Angenommen, Bird ist eine benutzerdefinierte Funktion, wird ein natives nicht integriertes Objekt gemäß http://es5.github.io/#x13.2 von der Javascript-Implementierung erstellt. Im Gegensatz dazu native eingebautObjekte sind seit dem Start eines Javascript-Programms vorhanden (z. B. Object und viele andere). Ein Unterschied zwischen einem nativen Objekt und einem Hostobjekt besteht darin, dass das erstere von der Javascript-Implementierung erstellt wird und das letztere von der Hostumgebung bereitgestellt wird. Infolgedessen kann sich die interne [[Klasse]] Eigenschaft des Hostobjekts von der von integrierten Objekten verwendeten unterscheiden (z. B. "Argumente", "Array", "Boolescher Wert", "Datum", "Fehler", "Funktion", " JSON "," Math "," Number "," Object "," RegExp "und" String ").

Erwähnenswert ist auch, dass ECMA6 http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf die nativen Terminologie- und Hostobjekte nicht mehr verwendet. Stattdessen werden die folgenden Objekttypen mit klareren Erklärungen für das beabsichtigte Verhalten definiert.

4.3.6 gewöhnliches Objekt

Objekt mit dem Standardverhalten für die wesentlichen internen Methoden, die von allen Objekten unterstützt werden müssen

4.3.7 exotisches Objekt

Objekt, das nicht das Standardverhalten für eine oder mehrere der wesentlichen internen Methoden aufweist, die von allen Objekten unterstützt werden müssen. HINWEIS Jedes Objekt, das kein gewöhnliches Objekt ist, ist ein exotisches Objekt.

4.3.8 Standardobjekt

Objekt, dessen Semantik durch diese Spezifikation definiert ist

4.3.9 eingebautes Objekt

Objekt, das von einer ECMAScript-Implementierung angegeben und bereitgestellt wird

jaaw
quelle
3

Zusätzlich zu den anderen Antworten zu Host-Objekten.

Hostobjekte sind spezifisch für eine Umgebung. Als nächstes gibt es neben den Browser-Host-Objekten auch bestimmte Objekte für nodejs.

Beginnen Sie im Beispiel zunächst mit den in Javascript definierten Standardobjekten. Dann die gemeinsamen Objekte für den Browser / DOM. Der Knoten hat seine eigenen Objekte.

  1. Beispiele für integrierte Standard-Javascript -Objekte:

  2. Beispiele für das Hostobjekt- Dokumentobjektmodell :

  3. Hostobjekte in Node.js :

Remi
quelle
1

Betrachtet man drei Objekte: Host, Native, Custom.

Hostobjekte werden von der Umgebung erstellt und sind umgebungsspezifisch. Die bekannteste Umgebung wäre ein Webbrowser, könnte aber auch eine andere Plattform sein. Die im Webbrowser erstellten Hostobjekte können das Fensterobjekt oder das Dokument sein. Normalerweise verwendet ein Browser eine API, um Hostobjekte zu erstellen, die das Dokumentobjektmodell in JavaScript widerspiegeln. (Webbrowser haben verschiedene JavaScript-Engines, die dies tun.) Ein Host-Objekt wird automatisch erstellt, sobald die Seite in einem Browser gerendert wird.

Ein natives Objekt wird vom Entwickler mithilfe vordefinierter JavaScript-Klassen erstellt. Native Objekte befinden sich in Ihrem schriftlichen Skript.

Dann wird ein benutzerdefiniertes Objekt vom Entwickler aus einer benutzerdefinierten (nicht vordefinierten oder teilweise vordefinierten) Klasse erstellt.

Khamaseen
quelle
0

Native Objekte sind Objekte, die den Spezifikationen entsprechen, dh "Standardobjekte".

Hostobjekte sind Objekte, die der Browser (oder eine andere Laufzeitumgebung wie Node) bereitstellt.

Die meisten Hostobjekte sind native Objekte, und wenn Sie etwas mit instanziieren new, können Sie zu 99,99% sicher sein, dass es sich um ein natives Objekt handelt, es sei denn, Sie spielen mit seltsamen Hostobjekten herum.

Dieser Begriff wurde aufgrund des Vorhandenseins sehr bizarrer Objekte im IE (und anderen alten Browsern?) Eingeführt . Beispielsweise:

typeof document.all == "undefined"; // true
document.all.myElementId; // object

Wenn man dies sieht, würde jeder zustimmen, dass dies document.alleindeutig "nicht standardisiert" und somit ein nicht natives Hostobjekt ist.

Warum also nicht zuerst native Objekte als Standardobjekte bezeichnen ? Einfach: Schließlich spricht das Standard (!) -Dokument auch über nicht native Objekte, und wenn man sie als nicht standard bezeichnet, würde dies zu einem Paradoxon führen.

Nochmal:

  • native == "Standard"
  • host == vom Browser oder Node bereitgestellt oder…
  • Die meisten Hostobjekte sind nativ, und alle Nicht-Hostobjekte sind ebenfalls nativ
user123444555621
quelle
Sie sind dort ein bisschen von den Schienen geraten. "Die meisten Hostobjekte sind nativ" ist falsch. Tatsächlich sind per Definition ALLE Hostobjekte NICHT nativ. Native bedeutet sicher "Standard", aber es bedeutet Standard in der Sprachspezifikation, nicht Standard im Sinne von ungewöhnlich. JavaScript (ECMASCript) definiert mehrere Schnittstellen / APIs, die von Browsern und anderen Hosts implementiert werden, z. B.: String, Date, MATH, Boolean, Number, JSON und XmlHTTP. Diese Objekte sind verfügbar, da der Host eine ECMAScript-kompatible Engine implementiert und den ECMA-Standard erfüllt.
Scott Marcus
0

Dies mag übertrieben sein, aber der Einfachheit halber ist ein natives Objekt vorhanden und kann in jeder Umgebung verwendet werden, die eine ECMAScript-kompatible Engine implementiert. Dies ist normalerweise (aber nicht immer) ein Browser.

So stellt Ihnen beispielsweise Ihr Internet Explorer oder Ihr Google Chrome das String-Objekt nicht zur Verfügung. Der Grund, warum Sie das String-Objekt verwenden können, liegt darin, dass es in der JavaScript-Sprache selbst "nativ" (integriert) ist.

Wenn Sie jedoch ein Popup-Fenster erstellen möchten, müssen Sie das Fensterobjekt verwenden. Das Fensterobjekt wird von der Browsersoftware selbst bereitgestellt, ist also nicht für JavaScript nativ, sondern Teil des "Browserobjektmodells" oder der Stückliste.

Scott Marcus
quelle