¿Cuál es la diferencia entre objetos nativos y objetos host?

90

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

ppecher
fuente
2
Los objetos nativos se definen en la especificación ECMAScript, los objetos de host no.
Šime Vidas
6
Un elemento DOM, por ejemplo, new Image()es un objeto host.
@ ŠimeVidas: ¿Hay alguna razón por la que dejaste un comentario que contradice tu respuesta?
user113716
@ Ӫ _._ Ӫ Eso es lo mío ahora:)
Šime Vidas
1
@ ŠimeVidas: Su comentario indica que los objetos de host no están definidos en la especificación ECMAScript . Su respuesta dice "Las definiciones para ambos están en la especificación de ECMAScript" .
user113716

Respuestas:

133

Ambos términos se definen en la especificación ECMAScript:

objeto nativo

objeto en una implementación de ECMAScript cuya semántica está completamente definida por esta especificación en lugar de por el entorno del host.

NOTA Los objetos nativos estándar se definen en esta especificación. Algunos objetos nativos están integrados; otros pueden construirse durante el curso de la ejecución de un programa ECMAScript.

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

objeto anfitrión

objeto proporcionado por el entorno host para completar el entorno de ejecución de ECMAScript.

NOTA Cualquier objeto que no sea nativo es un objeto anfitrión.

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


Algunos ejemplos:

Objetos nativos: Object(constructor), Date, Math, parseInt, eval, métodos de cuerda como indexOfy replace, métodos de arreglos, ...

Objetos anfitrión (asumiendo entorno de navegador): window, document, location, history, XMLHttpRequest, setTimeout, getElementsByTagName, querySelectorAll, ...

Šime Vidas
fuente
8
dale algunos ejemplos también, objeto nativo: Array, String .., objeto host: ventana ...
Poelinca Dorin
1
¿qué pasa con un custructor personalizado? por ejemplo, el ejemplo del pájaro en mi publicación
ppecher
2
@ ŠimeVidas: "Entonces es un objeto host". Eso no es correcto. Consulte la definición de host objectdescrito en esta respuesta .
user113716
1
ŠimeVidas: Pero la especificación establece 'El valor de la propiedad interna [[Clase]] de un objeto host puede ser cualquier valor de cadena excepto uno de "Argumentos", "Matriz", "Booleano", "Fecha", "Error", "Función", "JSON", "Matemáticas", "Número", "Objeto" , "RegExp" y "Cadena". ' La propiedad [[Class]] interna de su objeto Bird será 'Object', o se presentará mediante Object.prototype.toStringcomo '[object Object]'.
user113716
2
@ ŠimeVidas, no estoy de acuerdo, si Birdes 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 el newoperador, etc., etc., etc.) es un objeto nativo ... podría dejar una respuesta ...
Christian C. Salvadó
28

Es más claro si distinguimos entre tres tipos de objetos:

Objetos incorporados : String, Math, RegExp, Object, Functionetc - 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.

JacquesB
fuente
Los objetos nativos se refieren a aquellos objetos que se crean mediante la implementación de JavaScript (motor). La diferencia entre los objetos integrados y otros nativos (objetos de usuario) es que los objetos anteriores están presentes desde el inicio del programa javascript cumpliendo con las reglas ECMA relevantes. Desde ECMA6 (<ECMA6 ecma-international.org/publications/files/ECMA-ST/… ), no utiliza la terminología anterior para clasificar objetos. Consulte mi respuesta a continuación.
jaaw
17

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

Los objetos nativos tienen una propiedad [[Class]] interna de uno de los siguientes:

"Argumentos", "Matriz", "Booleano", "Fecha", "Error", "Función", "JSON", "Matemáticas", "Número", "Objeto", "RegExp" y "Cadena" .

Para tu bird1será:

"Objeto"

Como si crearas una función:

function my_func() {
    // ...
}

... my_funcno está definido en ECMAScript, pero sigue siendo un objeto nativo con la [[Clase]] interna:

"Función"

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 divses 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:

"NodeList"

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.

usuario113716
fuente
2
+1, estoy de acuerdo con usted, birdy Birdson 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 ejemplo window.alerttiene "Function"como valor de su [[Class]]propiedad casi todas las implementaciones, en IE tiene "Object", y todavía es un objeto host ...
Christian C. Salvadó
Gracias @CMS. Sí, no quise poner demasiado énfasis en el uso del interno [[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.alerttener un interno [[Class]]de "Function"parecería ser una violación de ES 5?
user113716
Estoy tratando de ver este ain en acción, pero si obtengo el tipo de ese div, divs/NodeListobtengo un object. Supongo que todavía no lo entiendo, pero ¿no lo convertiría en un objeto nativo?
Mark B
Esto es de gran ayuda . Obtener todo windowmuestra todos los objetos del host
Mark B
Bird no es un objeto nativo porque su interfaz no se describe completamente en el estándar ECMASCript. Realmente es así de simple. El objeto es nativo y String es nativo, pero los objetos definidos por el usuario o definidos por el host no son nativos.
Scott Marcus
3

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

4.3.6 objeto ordinario

objeto que tiene el comportamiento predeterminado para los métodos internos esenciales que deben ser compatibles con todos los objetos

4.3.7 objeto exótico

objeto que no tiene el comportamiento predeterminado para uno o más de los métodos internos esenciales que deben ser compatibles con todos los objetos. NOTA Cualquier objeto que no sea un objeto ordinario es un objeto exótico.

4.3.8 objeto estándar

objeto cuya semántica está definida por esta especificación

4.3.9 objeto incorporado

objeto especificado y proporcionado por una implementación de ECMAScript

mandíbula
fuente
3

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.

  1. Ejemplos de objetos integrados estándar de Javascript :

  2. Ejemplos de modelos de objetos de documento de objetos de host :

  3. Objetos de host en Node.js :

Remi
fuente
1

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

Khamaseen
fuente
0

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.alles 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:

  • nativo == "estándar"
  • host == proporcionado por el navegador o el nodo o ...
  • la mayoría de los objetos de host son nativos y todos los objetos que no son de host también son nativos
usuario123444555621
fuente
Te has descarrilado un poco allí. "La mayoría de los objetos de host son nativos" es incorrecto. De hecho, por definición, TODOS los objetos del host NO son nativos. Nativo significa "estándar" con seguridad, pero significa estándar en la especificación del lenguaje, no estándar en el sentido de fuera de lo común. JavaScript (ECMASCript) define varias interfaces / API que son implementadas por navegadores y otros hosts, como: String, Date, MATH, Boolean, Number, JSON y XmlHTTP. Estos objetos están disponibles porque el host implementa un motor compatible con ECMAScript y cumple con el estándar ECMA.
Scott Marcus
0

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.

Scott Marcus
fuente