Qual è la differenza tra oggetti nativi e oggetti host?


91

Quest'ultimo si riferisce semplicemente a oggetti funzione non primitivi creati da un costruttore personalizzato (ad esempio, var bird1 = new Bird ();)?


2
Gli oggetti nativi sono definiti nella specifica ECMAScript, gli oggetti host non lo sono.
Šime Vidas

6
Un elemento DOM, ad esempio, new Image()è un oggetto host, ad esempio.

@ ŠimeVidas: C'è qualche motivo per cui hai lasciato un commento che contraddice la tua risposta?
user113716

@ Ӫ _._ Ӫ Questo è il mio genere ora:)
Šime Vidas

1
@ ŠimeVidas: il tuo commento afferma che gli oggetti host non sono definiti nella specifica ECMAScript . La tua risposta afferma "Le definizioni per entrambi sono nella specifica ECMAScript" .
user113716

Risposte:


135

Entrambi i termini sono definiti nella specifica ECMAScript:

oggetto nativo

oggetto in un'implementazione ECMAScript la cui semantica è completamente definita da questa specifica piuttosto che dall'ambiente host.

NOTA Gli oggetti nativi standard sono definiti in questa specifica. Alcuni oggetti nativi sono incorporati; altri possono essere costruiti durante l'esecuzione di un programma ECMAScript.

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

oggetto host

oggetto fornito dall'ambiente host per completare l'ambiente di esecuzione di ECMAScript.

NOTA Qualsiasi oggetto che non è nativo è un oggetto host.

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


Alcuni esempi:

Oggetti nativi: Object(costruttore), Date, Math, parseInt, eval, metodi delle stringhe come indexOfe replace, metodi di array, ...

Oggetti host (supponendo che l'ambiente del browser): window, document, location, history, XMLHttpRequest, setTimeout, getElementsByTagName, querySelectorAll, ...


8
forniscigli anche alcuni esempi, oggetto nativo: Array, String .., oggetto host: window ...
Poelinca Dorin

1
che dire di un custructor personalizzato? ad esempio, l'esempio di uccello nel mio post
ppecher

2
@ ŠimeVidas: "Allora è un oggetto host." Non è corretto. Vedi la definizione di host objectdescritta in questa risposta .
user113716

1
ŠimeVidas: Ma la specifica afferma: "Il valore della proprietà interna [[Classe]] di un oggetto host può essere qualsiasi valore String tranne uno tra" Arguments "," Array "," Boolean "," Date "," Error ", "Funzione", "JSON", "Matematica", "Numero", "Oggetto" , "RegExp" e "Stringa". " La proprietà interna [[Class]] del tuo oggetto Bird sarà 'Object', o presentata Object.prototype.toStringcome '[object Object]'.
user113716

2
@ ŠimeVidas, non sono d'accordo, se Birdè una funzione definita dall'utente, la sua semantica è "completamente definita" dalla specifica ES (come funzionano gli oggetti funzione, come vengono creati, eseguiti, utilizzati con l' newoperatore, ecc., Ecc.) È un oggetto nativo ... potrei lasciare una risposta ...
Christian C. Salvadó

28

È più chiaro se distinguiamo tra tre tipi di oggetti:

Built-in oggetti : String, Math, RegExp, Object, Functionecc - di base predefiniti oggetti sempre disponibili in JavaScript. Definito nella specifica ECMAScript.

Oggetti host : oggetti come window, XmlHttpRequest, nodi DOM e così via, che è fornito dall'ambiente del browser. Sono distinti dagli oggetti incorporati perché non tutti gli ambienti avranno gli stessi oggetti host. Se JavaScript viene eseguito al di fuori del browser, ad esempio come linguaggio di scripting lato server come in Node.js, saranno disponibili diversi oggetti host.

Oggetti utente : oggetti definiti nel codice JavaScript. Quindi "Bird" nel tuo esempio sarebbe un oggetto utente.

La specifica JavaScript raggruppa gli oggetti incorporati e gli oggetti utente come oggetti nativi . Questo è un uso non ortodosso del termine "nativo", poiché gli oggetti utente sono ovviamente implementati in JavaScript mentre i built-in sono molto probabilmente implementati in un linguaggio diverso sotto il cofano, proprio come sarebbero gli oggetti host. Ma dal punto di vista della specifica JavaScript, sia i builtin che gli oggetti utente sono nativi di JavaScript perché sono definiti nella specifica JavaScript, mentre gli oggetti host non lo sono.


Gli oggetti nativi si riferiscono a quegli oggetti creati dall'implementazione di javascript (motore). La differenza tra gli oggetti incorporati e altri oggetti nativi (oggetti utente) è che gli oggetti precedenti sono presenti dall'inizio del programma javascript in conformità con le regole ECMA pertinenti. Poiché ECMA6 (<ECMA6 ecma-international.org/publications/files/ECMA-ST/... ), non usa sopra terminologia agli oggetti classificabile. Fare riferimento alla mia risposta di seguito.
jaaw

17

Ecco la mia comprensione delle specifiche.

Questo:

var bird = new Bird();

... risulta in un oggetto nativo che è stato semplicemente creato usando l' newoperatore.

Gli oggetti nativi hanno una proprietà [[Class]] interna di uno dei seguenti:

"Arguments", "Array", "Boolean", "Date", "Error", "Function", "JSON", "Math", "Number", "Object", "RegExp" e "String" .

Per il tuo bird1sarà:

"Oggetto"

Proprio come se crei una funzione:

function my_func() {
    // ...
}

... my_funcnon è definito in ECMAScript, ma è ancora un oggetto nativo con la [[Class]] interna:

"Funzione"

Un oggetto host è un oggetto fornito dall'ambiente per servire uno scopo specifico a quell'ambiente non definito nelle specifiche.

Per esempio:

var divs = document.getElementsByTagName('div')

L'oggetto a cui fa riferimento divsè un NodeList , che è integrato nell'ambiente in modo tale da sembrare un normale oggetto JavaScript, ma non è definito da nessuna parte dalle specifiche.

La sua proprietà interna [[Class]] è:

"NodeList"

Ciò fornisce ai progettisti dell'implementazione una certa flessibilità nell'adattare l'implementazione alle esigenze specifiche dell'ambiente.

Esistono requisiti per gli oggetti host definiti in tutte le specifiche.


2
+1, sono d'accordo con te birde Birdsono oggetti nativi , sono una funzione definita dall'utente ( Bird) e un oggetto ( bird) creato dall'uso della funzione come costruttore, tutte le semantiche di questo sono definite nelle specifiche. Riguardo agli oggetti host, non fare troppo affidamento sulla [[Class]]proprietà interna, ad esempio window.alertha "Function"come valore della sua [[Class]]proprietà quasi tutte le implementazioni, su IE ha "Object", ed è ancora un oggetto host ...
Christian C. Salvadó

Grazie @CMS. Sì, non volevo porre troppa enfasi sull'uso dell'interno [[Class]]. Piuttosto solo per usarlo come uno sguardo tangibile su come gli implementatori hanno interpretato i diversi tipi di oggetti. Quindi quindi window.alertavere un interno [[Class]]di "Function"sembrerebbe essere una violazione di ES 5?
user113716

Sto cercando di vedere questo in azione, ma se ottengo il tipo di quel div, divs/NodeListottengo un object. Immagino di non capirlo ancora, ma non lo renderebbe un oggetto nativo?
Mark B

Questo è utile . Ottenere tutto in windowmostra tutti gli oggetti host
Mark B

Bird non è un oggetto nativo perché la sua interfaccia non è completamente descritta nello standard ECMASCript. È davvero così semplice. Object è nativo e String è nativo, ma gli oggetti definiti dall'utente o dall'host non sono nativi.
Scott Marcus

4

Oltre alle altre risposte relative agli oggetti host.

Gli oggetti host sono specifici di un ambiente. Quindi, accanto agli oggetti host dei browser, ci sono anche oggetti specifici in nodejs.

Per il bene dell'esempio, iniziare prima con gli oggetti standard come definiti in Javascript. Quindi gli oggetti comuni per il browser / DOM. Il nodo ha i propri oggetti.

  1. Esempi di oggetti incorporati JavaScript standard :
  1. Oggetti host Esempi di modelli di oggetti documento :
  1. Oggetti host in Node.js :

3

Impossibile visualizzare una risposta convincente alla domanda se var bird1 = new Bird();è un oggetto nativo o host. Supponendo che Bird sia una funzione definita dall'utente, un oggetto nativo non integrato verrà creato secondo http://es5.github.io/#x13.2 dall'implementazione di javascript. Al contrario, nativo integratogli oggetti saranno presenti dall'inizio di un programma javascript (come Object e molti altri). Una differenza tra un oggetto nativo e un oggetto host è che il primo è creato dall'implementazione di javascript e il secondo è fornito dall'ambiente host. Di conseguenza, la proprietà [[classe]] interna dell'oggetto host può essere diversa da quella utilizzata dagli oggetti incorporati (ad esempio "Argomenti", "Array", "Booleano", "Data", "Errore", "Funzione", " JSON "," Math "," Number "," Object "," RegExp "e" String ").

Inoltre, vale la pena notare che ECMA6 http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf non utilizza più la terminologia nativa e gli oggetti host. Invece, definisce di seguito i tipi di oggetto, con spiegazioni più chiare del comportamento previsto.

4.3.6 oggetto ordinario

oggetto che ha il comportamento predefinito per i metodi interni essenziali che devono essere supportati da tutti gli oggetti

4.3.7 oggetto esotico

oggetto che non ha il comportamento predefinito per uno o più dei metodi interni essenziali che devono essere supportati da tutti gli oggetti NOTA Qualsiasi oggetto che non sia un oggetto ordinario è un oggetto esotico.

4.3.8 oggetto standard

oggetto la cui semantica è definita da questa specifica

4.3.9 oggetto incorporato

oggetto specificato e fornito da un'implementazione ECMAScript


1

Considerando tre oggetti: Host, Native, Custom.

Gli oggetti host vengono creati dall'ambiente e sono specifici dell'ambiente. L'ambiente più conosciuto sarebbe un browser web, ma potrebbe essere un'altra piattaforma. Gli oggetti host creati nel browser web potrebbero essere l'oggetto finestra o il documento. In genere un browser utilizza un'API per creare oggetti host per riflettere il modello di oggetti del documento in JavaScript. (Il browser web ha diversi motori JavaScript che lo fanno) Un oggetto host viene creato automaticamente nel momento in cui la pagina viene visualizzata in un browser.

Un oggetto nativo viene creato dallo sviluppatore utilizzando classi predefinite di JavaScript. Gli oggetti nativi sono nel tuo copione scritto.

Quindi, un oggetto personalizzato viene creato dallo sviluppatore da una classe personalizzata (non predefinita o parzialmente predefinita).


0

Gli oggetti nativi sono oggetti che aderiscono alle specifiche, ovvero "oggetti standard".

Gli oggetti host sono oggetti forniti dal browser (o da un altro ambiente di runtime come Node).

La maggior parte degli oggetti host sono oggetti nativi e ogni volta che si crea un'istanza di qualcosa utilizzando new , si può essere sicuri al 99,99% che si tratti di un oggetto nativo, a meno che non si scherzi con strani oggetti host.

Questa nozione è stata introdotta a causa della presenza di oggetti molto bizzarri in IE (e altri vecchi browser?) . Per esempio:

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

Vedendo questo, tutti sarebbero d'accordo che document.allè chiaramente "non standard", e quindi a oggetto host non nativo .

Allora perché non chiamare gli oggetti nativi oggetti standard in primo luogo? Semplice: dopo tutto, il file Standard (!) Parla anche di oggetti non nativi e li chiama non standard porterebbe a un paradosso.

Ancora:

  • nativo == "standard"
  • host == fornito dal browser o Node o ...
  • la maggior parte degli oggetti host sono nativi e anche tutti gli oggetti non host sono nativi

Sei uscito un po 'dai binari lì. "La maggior parte degli oggetti host sono nativi" non è corretto. Infatti, per definizione, TUTTI gli oggetti host NON sono nativi. Native significa "standard" di sicuro, ma significa standard nella specifica del linguaggio, non standard nel senso di fuori dal comune. JavaScript (ECMASCript) definisce diverse interfacce / API implementate da browser e altri host, come: String, Date, MATH, Boolean, Number, JSON e XmlHTTP. Questi oggetti sono disponibili perché l'host implementa un motore conforme a ECMAScript e soddisfa lo standard ECMA.
Scott Marcus

0

Questo può essere eccessivo, ma per semplicità un oggetto nativo è quello che esiste ed è utilizzabile in qualsiasi ambiente che implementa un motore conforme a ECMAScript. Questo è solitamente (ma non sempre) un browser.

Quindi, il tuo Internet Explorer o il tuo Google Chrome, non ti rende disponibile l'oggetto String, ad esempio. Il motivo per cui è possibile utilizzare l'oggetto String è perché è "nativo" (integrato) nel linguaggio JavaScript stesso.

Tuttavia, se desideri creare una finestra pop-up, dovrai utilizzare l'oggetto finestra. L'oggetto finestra è fornito dal software del browser stesso, quindi non è nativo di JavaScript, ma fa parte del "Browser Object Model" o BOM.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.