¿Este último simplemente se refiere a objetos de función no primarios que fueron creados por un constructor personalizado (por ejemplo, var bird1 = new Bird ();)?
javascript
ppecher
fuente
fuente
new Image()
es un objeto host.:)
Respuestas:
Ambos términos se definen en la especificación ECMAScript:
Fuente: http://es5.github.com/#x4.3.6
Fuente: http://es5.github.com/#x4.3.8
Algunos ejemplos:
Objetos nativos:
Object
(constructor),Date
,Math
,parseInt
,eval
, métodos de cuerda comoindexOf
yreplace
, métodos de arreglos, ...Objetos anfitrión (asumiendo entorno de navegador):
window
,document
,location
,history
,XMLHttpRequest
,setTimeout
,getElementsByTagName
,querySelectorAll
, ...fuente
host object
descrito en esta respuesta .'Object'
, o se presentará medianteObject.prototype.toString
como'[object Object]'
.Bird
es una función definida por el usuario, su semántica está "completamente definida" por la especificación ES (cómo funcionan los objetos de función, cómo se crean, ejecutan, usan con elnew
operador, etc., etc., etc.) es un objeto nativo ... podría dejar una respuesta ...Es más claro si distinguimos entre tres tipos de objetos:
Objetos incorporados :
String
,Math
,RegExp
,Object
,Function
etc - básicos predefinidos siempre objetos disponibles en JavaScript. Definido en la especificación ECMAScript.Objetos host : objetos como
window
,XmlHttpRequest
, nodos DOM y así sucesivamente, que es proporcionada por el entorno del navegador. Son distintos de los objetos integrados porque no todos los entornos tendrán los mismos objetos de host. Si JavaScript se ejecuta fuera del navegador, por ejemplo, como lenguaje de programación del lado del servidor como en Node.js, estarán disponibles diferentes objetos de host.Objetos de usuario : objetos definidos en código JavaScript. Entonces, 'Bird' en su ejemplo sería un objeto de usuario.
La especificación de JavaScript agrupa los objetos integrados y los objetos de usuario como objetos nativos . Este es un uso poco ortodoxo del término "nativo", ya que los objetos de usuario se implementan obviamente en JavaScript, mientras que los incorporados probablemente se implementan en un idioma diferente bajo el capó, tal como lo serían los objetos del host. Pero desde la perspectiva de la especificación de JavaScript, tanto los objetos incorporados como los de usuario son nativos de JavaScript porque están definidos en la especificación de JavaScript, mientras que los objetos de host no.
fuente
Aquí está mi comprensión de la especificación.
Esta:
var bird = new Bird();
... da como resultado un objeto nativo que simplemente se creó con el
new
operador.Los objetos nativos tienen una propiedad [[Class]] interna de uno de los siguientes:
Para tu
bird1
será:Como si crearas una función:
function my_func() { // ... }
...
my_func
no está definido en ECMAScript, pero sigue siendo un objeto nativo con la [[Clase]] interna:Un objeto anfitrión es un objeto proporcionado por el entorno con el fin de cumplir un propósito específico para ese entorno no definido por la especificación.
Por ejemplo:
var divs = document.getElementsByTagName('div')
El objeto al que hace referencia
divs
es un NodeList , que está integrado en el entorno de tal manera que se siente como un objeto JavaScript normal, pero no está definido en ninguna parte por la especificación.Su propiedad interna [[Class]] es:
Esto proporciona a los diseñadores de implementación cierta flexibilidad para adaptar la implementación a las necesidades específicas del entorno.
Hay requisitos de objetos host que se definen en toda la especificación.
fuente
bird
yBird
son objetos nativos , son una función definida por el usuario (Bird
) y un objeto (bird
) creado por el uso de la función como constructor, toda la semántica de esto se define en la especificación. Acerca de los objetos host, no confíe demasiado en la[[Class]]
propiedad interna, por ejemplowindow.alert
tiene"Function"
como valor de su[[Class]]
propiedad casi todas las implementaciones, en IE tiene"Object"
, y todavía es un objeto host ...[[Class]]
. Más bien para usarlo como una visión tangible de cómo los implementadores han interpretado los diferentes tipos de objetos. Entonces, ¿window.alert
tener un interno[[Class]]
de"Function"
parecería ser una violación de ES 5?divs/NodeList
obtengo unobject
. Supongo que todavía no lo entiendo, pero ¿no lo convertiría en un objeto nativo?window
muestra todos los objetos del hostNo pude ver una respuesta convincente a la pregunta de si
var bird1 = new Bird();
es un objeto nativo o anfitrión. Suponiendo que Bird es una función definida por el usuario, se creará un objeto nativo no integrado de acuerdo con http://es5.github.io/#x13.2 mediante la implementación de JavaScript. Por el contrario, nativo integradolos objetos estarán presentes desde el inicio de un programa javascript (como Object y muchos otros). Una diferencia entre un objeto nativo y un objeto host es que el primero lo crea la implementación de JavaScript y el segundo lo proporciona el entorno host. Como resultado, la propiedad interna [[clase]] del objeto host puede ser diferente de las utilizadas por los objetos integrados (es decir, "Argumentos", "Matriz", "Booleano", "Fecha", "Error", "Función", JSON "," Matemáticas "," Número "," Objeto "," RegExp "y" Cadena ").Además, vale la pena señalar que ECMA6 http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf ya no usa la terminología nativa y objetos host. En cambio, define a continuación los tipos de objetos, con explicaciones más claras de su comportamiento previsto.
fuente
Además de las otras respuestas con respecto a los objetos de host.
Los objetos de host son específicos de un entorno. Entonces, a continuación, los objetos del host del navegador, también hay objetos específicos para nodejs.
Por el bien del ejemplo, primero comience con los objetos estándar como se define en Javascript. Luego, los objetos comunes para el navegador / DOM. El nodo tiene sus propios objetos.
Ejemplos de objetos integrados estándar de Javascript :
Ejemplos de modelos de objetos de documento de objetos de host :
Objetos de host en Node.js :
fuente
Considerando tres objetos: Host, Native, Custom.
Los objetos de host son creados por el entorno y son específicos del entorno. El entorno más conocido sería un navegador web, pero podría ser otra plataforma. Los objetos de host creados en el navegador web podrían ser el objeto de la ventana o el documento. Normalmente, un navegador utiliza una API para crear objetos de host para reflejar el modelo de objetos de documento en JavaScript. (Los navegadores web tienen diferentes motores JavaScript que hacen esto) Un objeto host se crea automáticamente en el momento en que la página se representa en un navegador.
Un objeto nativo es creado por el desarrollador utilizando clases predefinidas de JavaScript. Los objetos nativos están en su secuencia de comandos escrita.
Luego, el desarrollador crea un objeto personalizado a partir de una clase personalizada (no predefinida o parcialmente predefinida).
fuente
Los objetos nativos son objetos que se adhieren a las especificaciones, es decir, "objetos estándar".
Los objetos de host son objetos que proporciona el navegador (u otro entorno de ejecución como Node).
La mayoría de los objetos de host son objetos nativos, y cada vez que crea una instancia de algo usando
new
, puede estar 99,99% seguro de que es un objeto nativo, a menos que juegue con objetos host extraños.Esta noción se ha introducido debido a la presencia de objetos muy extraños en IE (¿y otros navegadores antiguos?) . Por ejemplo:
typeof document.all == "undefined"; // true document.all.myElementId; // object
Al ver esto, todos estarían de acuerdo en que
document.all
es claramente "no estándar" y, por lo tanto, un objeto host no nativo .Entonces, ¿por qué no llamar a los objetos nativos objetos estándar en primer lugar? Simple: después de todo, el documento Estándar (!) También habla de objetos no nativos, y llamarlos no estándar conduciría a una paradoja.
De nuevo:
fuente
Esto puede ser excesivo, pero por simplicidad, un objeto nativo es uno que existe y se puede usar en cualquier entorno que implemente un motor compatible con ECMAScript. Suele ser (pero no siempre) un navegador.
Por lo tanto, su Internet Explorer o su Google Chrome, no hace que el objeto String esté disponible para usted, por ejemplo. La razón por la que puede utilizar el objeto String es porque es "nativo" (integrado) del lenguaje JavaScript en sí.
Sin embargo, si desea crear una ventana emergente, deberá utilizar el objeto de ventana. El objeto de ventana lo proporciona el software del navegador, por lo que no es nativo de JavaScript, pero es parte del "Modelo de objeto del navegador" o la lista de materiales.
fuente