Bezieht sich letzteres einfach auf nichtprimitive Funktionsobjekte, die von einem benutzerdefinierten Konstruktor erstellt wurden (z. B. var bird1 = new Bird ();)?
javascript
ppecher
quelle
quelle
new Image()
- ist beispielsweise ein Host-Objekt.:)
Antworten:
Beide Begriffe sind in der ECMAScript-Spezifikation definiert:
Quelle: http://es5.github.com/#x4.3.6
Quelle: http://es5.github.com/#x4.3.8
Einige Beispiele:
Native Objekte:
Object
(Konstruktor)Date
,Math
,parseInt
,eval
, String - Methoden wieindexOf
undreplace
Array - Methoden, ...Host - Objekte (Browserumgebung vorausgesetzt):
window
,document
,location
,history
,XMLHttpRequest
,setTimeout
,getElementsByTagName
,querySelectorAll
, ...quelle
host object
beschriebene Definition von .'Object'
, oder über präsentiertObject.prototype.toString
wie'[object Object]'
.Bird
es 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 demnew
Operator verwendet usw. usw. usw.) natives Objekt ... Ich könnte eine Antwort fallen lassen ...Es ist klarer, wenn wir zwischen drei Arten von Objekten unterscheiden:
Built-in - Objekte :
String
,Math
,RegExp
,Object
,Function
usw. - 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.
quelle
Hier ist mein Verständnis der Spezifikation.
Dies:
... führt zu einem nativen Objekt, das einfach mit dem
new
Operator erstellt wurde.Native Objekte haben eine interne [[Klasse]] Eigenschaft von einer der folgenden Eigenschaften:
Für
bird1
Sie wird es sein:Genau wie beim Erstellen einer Funktion:
...
my_func
ist in ECMAScript nicht definiert, aber es ist immer noch ein natives Objekt mit der internen [[Klasse]]: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:
Das Objekt, auf das verwiesen wird,
divs
ist 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:
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.
quelle
bird
undBird
sind 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 Beispielwindow.alert
hat sie"Function"
als Wert[[Class]]
fast alle Implementierungen als Wert für ihre Eigenschaft"Object"
, und sie ist immer noch ein Hostobjekt ...[[Class]]
. Eher nur, um einen konkreten Einblick in die Interpretation der verschiedenen Objekttypen durch die Implementierer zu erhalten. So dannwindow.alert
mit einer Innen[[Class]]
von"Function"
scheint eine Verletzung von IHM 5 zu sein?divs/NodeList
bekomme, bekomme ich einenobject
. Ich schätze, ich verstehe das noch nicht, aber würde das es nicht zu einem nativen Objekt machen?window
eingeben, werden alle Host-ObjekteEs 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.
quelle
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.
Beispiele für integrierte Standard-Javascript -Objekte:
Beispiele für das Hostobjekt- Dokumentobjektmodell :
Hostobjekte in Node.js :
quelle
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.
quelle
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:
Wenn man dies sieht, würde jeder zustimmen, dass dies
document.all
eindeutig "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:
quelle
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.
quelle