97 votes

Quelle est la différence entre les objets natifs et les objets hôtes ?

Je ne comprends pas la différence entre objets natifs et objets hôtes en JavaScript. Ce dernier fait-il simplement référence à des objets fonctionnels non primitifs qui ont été créés par un constructeur personnalisé (par exemple, var bird1 = new Bird(); ) ?

4 votes

Les objets natifs sont définis dans la spécification ECMAScript, les objets hôtes ne le sont pas.

7 votes

Un élément DOM -- disons, new Image() -- est un objet hôte, par exemple.

0 votes

@ŠimeVidas : Y a-t-il une raison pour laquelle vous avez laissé un commentaire qui contredit votre réponse ?

142voto

Šime Vidas Points 59994

Ces deux termes sont définis dans la spécification ECMAScript :

objet natif

dans une implémentation ECMAScript dont la sémantique est complètement définie par cette spécification plutôt que par l'environnement hôte.

NOTE Les objets natifs standard sont définis dans la présente spécification. Certains objets natifs sont intégrés ; d'autres peuvent être construits au cours de l'exécution d'un au cours de l'exécution d'un programme ECMAScript.

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

objet hôte

fourni par l'environnement hôte pour compléter l'objet l'environnement d'exécution d'ECMAScript.

NOTE Tout objet qui n'est pas natif est un objet hôte.

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


Quelques exemples :

Objets indigènes : Object (constructeur), Date , Math , parseInt , eval , des méthodes de chaînes de caractères comme indexOf et replace , méthodes de tableaux, ...

Objets hôtes (en supposant un environnement de navigation) : window , document , location , history , XMLHttpRequest , setTimeout , getElementsByTagName , querySelectorAll , ...

10 votes

Donnez-lui aussi des exemples, objet natif : Tableau, Chaîne ..., objet hôte : fenêtre ...

2 votes

Que dire d'un constructeur personnalisé ? par exemple, l'exemple de l'oiseau dans mon message

0 votes

@ppecher Est le Bird défini dans la spécification ECMAScript ? Non ? Il s'agit alors d'un objet hôte :P

30voto

JacquesB Points 19878

Cela est plus clair si l'on distingue trois types d'objets :

Objets intégrés : String , Math , RegExp , Object , Function etc. - objets prédéfinis de base toujours disponibles en JavaScript. Définis dans la spécification ECMAScript.

Objets d'accueil : des objets tels que window , XmlHttpRequest , les nœuds DOM, etc., qui sont fournis par l'environnement du navigateur. Ils sont distincts des objets intégrés car tous les environnements n'ont pas les mêmes objets hôtes. Si JavaScript s'exécute en dehors du navigateur, par exemple en tant que langage de script côté serveur comme dans Node.js, différents objets hôtes seront disponibles.

Objets de l'utilisateur : objets définis dans le code JavaScript. Ainsi, dans votre exemple, "Bird" serait un objet utilisateur.

La spécification JavaScript regroupe les objets intégrés et les objets utilisateur sous le nom de objets natifs . Il s'agit d'une utilisation peu orthodoxe du terme "natif", puisque les objets utilisateurs sont évidemment implémentés en JavaScript tandis que les objets intégrés sont très probablement implémentés dans un langage différent sous le capot, tout comme les objets hôtes le seraient. Mais du point de vue de la spécification JavaScript, les builtins et les objets utilisateurs sont natifs de JavaScript parce qu'ils sont définis dans la spécification JavaScript, alors que les objets hôtes ne le sont pas.

0 votes

Les objets natifs sont ceux qui sont créés par l'implémentation de javascript (moteur). Différence entre les objets intégrés et les autres objets natifs ( e )

17voto

user113716 Points 143363

Voici ma compréhension de la spec.

Ce:

var bird = new Bird();

...les résultats dans un Objet natif qui, tout simplement, qui est arrivé à être créé à l'aide de l' new de l'opérateur.

Objets natifs interne [[Catégorie]] de la propriété de l'une des opérations suivantes:

"Arguments", "Tableau", "Boolean", "Date", "Erreur", "Fonction", "JSON", "Mathématiques", "Nombre", "Objet", "RegExp", et la "Chaîne".

Pour votre bird1 il sera:

"Objet"

Tout comme si vous créez une fonction:

function my_func() {
    // ...
}

...my_func n'est pas défini dans ECMAScript, mais il est encore un objet natif avec l'intérieur de l' [[Catégorie]]:

"Fonction"

Une foule d'objet est un objet fourni par l'environnement, dans le but de servir un but précis pour que l'environnement ne sont pas définis dans le cahier des charges.

Par exemple:

var divs = document.getElementsByTagName('div')

L'objet référencé par divs est une NodeList, qui est intégré dans l'environnement de telle manière qu'il se sent comme un objet JavaScript, mais elle n'est pas nulle part défini par la spécification.

Son intérieur [[Catégorie]] propriété est:

"NodeList"

Cette offre de mise en œuvre de designers une certaine souplesse dans l'habillage, la mise en œuvre aux besoins spécifiques de l'environnement.

Il y a des exigences de l' hôte objets qui sont définis dans la spécification.

2 votes

+1, je suis d'accord avec vous, bird et Bird sont objets natifs Il s'agit d'une fonction définie par l'utilisateur ( Bird ), et un objet ( bird ) créée par l'utilisation de la fonction en tant que constructeur, toute la sémantique de cette fonction est définie dans la spécification. En ce qui concerne les objets hôtes, ne vous fiez pas trop à la fonction [[Class]] propriété interne, par exemple window.alert a "Function" comme la valeur de son [[Class]] dans presque toutes les implémentations, dans IE il a la propriété "Object" et il s'agit toujours d'un objet hôte...

0 votes

Merci @CMS. Oui, je ne voulais pas mettre trop l'accent sur l'utilisation de l'interface interne. [[Class]] . Il s'agit plutôt d'un aperçu concret de la manière dont les responsables de la mise en œuvre ont interprété les différents types d'objets. C'est ainsi que window.alert ayant une partie interne [[Class]] de "Function" semble être une violation de l'ES 5 ?

0 votes

J'essaie de voir cette action, mais si j'obtiens le type de cette div, divs/NodeList Je reçois un object . Je suppose que je n'ai pas encore compris, mais cela n'en ferait-il pas un objet natif ?

0voto

Pumbaa80 Points 27066

Les objets natifs sont des objets qui respectent les spécifications, c'est-à-dire des "objets standard".

Les objets hôtes sont des objets fournis par le navigateur (ou un autre environnement d'exécution comme Node).

La plupart des objets hôtes sont des objets natifs, et chaque fois que vous instanciez quelque chose à l'aide de la fonction new vous pouvez être sûr à 99,99 % qu'il s'agit d'un objet natif, à moins que vous n'utilisiez des objets hôtes bizarres.

Cette notion a été introduite en raison de la présence d'objets très bizarres dans l'IE (et d'autres anciens navigateurs ?) . Par exemple :

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

En voyant cela, tout le monde serait d'accord pour dire que document.all est manifestement "non standard", et donc un non indigène objet de l'hôte.

Pourquoi ne pas appeler les objets natifs objets standards en premier lieu ? C'est simple : après tout, le Standard( !) document parle également d'objets non natifs et les appelle non standard conduirait à un paradoxe.

Otra vez:

  • natif == "standard"
  • hôte == fourni par le navigateur ou Node ou
  • la plupart des objets hôtes sont natifs et tous les objets non hôtes sont également natifs

0 votes

Vous avez un peu déraillé. Il est faux de dire que "la plupart des objets hôtes sont natifs". En fait, par définition, TOUS les objets hôtes ne sont pas natifs. Natif signifie "standard", certes, mais cela signifie standard dans la spécification du langage, et non pas standard dans le sens de hors du commun. JavaScript (ECMASCript) définit plusieurs interfaces/API qui sont mises en œuvre par les navigateurs et d'autres hôtes, telles que : String, Date, MATH, Boolean, Number, JSON et XmlHTTP. Ces objets sont disponibles parce que l'hôte met en œuvre un moteur conforme à ECMAScript et respecte la norme ECMA.

0voto

Scott Marcus Points 45

C'est peut-être exagéré, mais pour simplifier, un objet natif est un objet qui existe et qui est utilisable dans n'importe quel environnement qui met en œuvre un moteur compatible avec ECMAScript. Il s'agit généralement (mais pas toujours) d'un navigateur.

Ainsi, votre Internet Explorer ou votre Google Chrome ne met pas l'objet String à votre disposition, par exemple. La raison pour laquelle vous pouvez utiliser l'objet String est qu'il est "natif" (intégré) au langage JavaScript lui-même.

Toutefois, si vous souhaitez créer une fenêtre contextuelle, vous devez utiliser l'objet fenêtre. L'objet window est fourni par le logiciel de navigation lui-même, il n'est donc pas natif de JavaScript, mais il fait partie du "modèle d'objet du navigateur" (Browser Object Model ou BOM).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X