Qual é a diferença entre objetos nativos e objetos de host?

90

O último simplesmente se refere a objetos de função não primitivos que foram criados por um construtor personalizado (por exemplo, var bird1 = new Bird ();)?

ppecher
fonte
2
Os objetos nativos são definidos na especificação ECMAScript, os objetos de host não.
Šime Vidas
6
Um elemento DOM - digamos, new Image()- é um objeto host, por exemplo.
@ ŠimeVidas: Existe algum motivo pelo qual você deixou um comentário que contradiz sua resposta?
user113716
@ Ӫ _._ Ӫ Essa é a minha praia agora:)
Šime Vidas
1
@ ŠimeVidas: Seu comentário afirma que os objetos host não são definidos na especificação ECMAScript . Sua resposta afirma: "As definições de ambos estão na especificação ECMAScript" .
user113716

Respostas:

133

Ambos os termos são definidos na especificação ECMAScript:

objeto nativo

objeto em uma implementação ECMAScript cuja semântica é totalmente definida por esta especificação e não pelo ambiente do host.

NOTA Objetos nativos padrão são definidos nesta especificação. Alguns objetos nativos são integrados; outros podem ser construídos durante a execução de um programa ECMAScript.

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

objeto hospedeiro

objeto fornecido pelo ambiente host para completar o ambiente de execução do ECMAScript.

NOTA Qualquer objeto que não seja nativo é um objeto host.

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


Alguns exemplos:

Objetos nativos: Object(construtor), Date, Math, parseInt, eval, métodos de corda como indexOfe replace, métodos de matriz, ...

Objetos de host (assumindo ambiente do navegador): window, document, location, history, XMLHttpRequest, setTimeout, getElementsByTagName, querySelectorAll, ...

Šime Vidas
fonte
8
dê a ele alguns exemplos também, objeto nativo: Array, String .., objeto host: janela ...
Poelinca Dorin
1
que tal um custrutor personalizado? por exemplo, o exemplo do pássaro no meu post
ppecher
2
@ ŠimeVidas: "Então é um objeto hospedeiro." Isso não é correto. Veja a definição de host objectdescrita nesta resposta .
user113716
1
ŠimeVidas: Mas a especificação afirma que 'O valor da propriedade interna [[Class]] de um objeto host pode ser qualquer valor String, exceto um de "Argumentos", "Array", "Booleano", "Data", "Erro", "Function", "JSON", "Math", "Number", "Object" , "RegExp" e "String". ' A propriedade interna [[Class]] de seu objeto Bird será 'Object', ou apresentada via Object.prototype.toStringcomo '[object Object]'.
user113716
2
@ ŠimeVidas, discordo, se Birdé uma função definida pelo usuário, sua semântica é "totalmente definida" pela especificação ES (como funcionam os objetos de função, como são criados, executados, usados ​​com o newoperador, etc, etc, etc) é um objeto nativo ... posso deixar uma resposta ...
Christian C. Salvadó
28

É mais claro se distinguirmos entre três tipos de objetos:

Objetos internos : String, Math, RegExp, Object, Functionetc. - núcleo predefinidos objetos sempre disponíveis em JavaScript. Definido na especificação ECMAScript.

Objetos hospedeiros : objetos como window,XmlHttpRequest , nós DOM e assim por diante, que é fornecido pelo ambiente do navegador. Eles são distintos dos objetos embutidos porque nem todos os ambientes terão os mesmos objetos de host. Se o JavaScript for executado fora do navegador, por exemplo, como linguagem de script do lado do servidor, como no Node.js, diferentes objetos de host estarão disponíveis.

Objetos de usuário : objetos definidos em código JavaScript. Portanto, 'Bird' em seu exemplo seria um objeto de usuário.

A especificação JavaScript agrupa objetos integrados e objetos de usuário juntos como objetos nativos . Este é um uso não ortodoxo do termo "nativo", uma vez que os objetos de usuário são obviamente implementados em JavaScript, enquanto os internos são provavelmente implementados em uma linguagem diferente por baixo do capô, assim como os objetos de host seriam. Mas da perspectiva da especificação do JavaScript, tanto os objetos internos quanto os objetos do usuário são nativos para o JavaScript porque são definidos na especificação do JavaScript, enquanto os objetos do host não são.

JacquesB
fonte
Objetos nativos referem-se àqueles objetos que são criados pela implementação de javascript (mecanismo). A diferença entre os objetos integrados e outros nativos (objetos do usuário) é que os objetos anteriores estão presentes desde o início do programa javascript em conformidade com as regras ECMA relevantes. Desde ECMA6 (<ECMA6 ecma-international.org/publications/files/ECMA-ST/… ), ele não usa a terminologia acima para classificar objetos. Consulte minha resposta abaixo.
jaaw
17

Aqui está meu entendimento da especificação.

Este:

var bird = new Bird();

... resulta em um objeto nativo que simplesmente aconteceu de ser criado usando o newoperador.

Objetos nativos têm uma propriedade interna [[Class]] de um dos seguintes:

"Argumentos", "Matriz", "Booleano", "Data", "Erro", "Função", "JSON", "Matemática", "Número", "Objeto", "RegExp" e "String" .

Para você bird1será:

"Objeto"

Assim como se você criasse uma função:

function my_func() {
    // ...
}

... my_funcnão está definido no ECMAScript, mas ainda é um objeto nativo com o interno [[Class]]:

"Função"

Um objeto de host é um objeto fornecido pelo ambiente a fim de servir a um propósito específico para aquele ambiente não definido na especificação.

Por exemplo:

var divs = document.getElementsByTagName('div')

O objeto referenciado por divsé um NodeList , que é integrado ao ambiente de tal maneira que parece um objeto JavaScript regular, embora não seja definido em nenhum lugar pela especificação.

Sua propriedade interna [[Class]] é:

"NodeList"

Isso fornece aos designers de implementação alguma flexibilidade para adequar a implementação às necessidades específicas do ambiente.

Existem requisitos de objetos de host que são definidos em toda a especificação.

user113716
fonte
2
+1, eu concordo com você, birde Birdsão objetos nativos , eles são uma função definida pelo usuário ( Bird), e um objeto ( bird) criado pelo uso da função como um construtor, todas as semânticas deste são definidas na especificação. Sobre os objetos hospedeiros, não confie muito na [[Class]]propriedade interna, por exemplo window.alerttem "Function"como valor de sua [[Class]]propriedade quase todas as implementações, no IE tem "Object", e ainda é um objeto hospedeiro ...
Christian C. Salvadó
Obrigado @CMS. Sim, eu não queria colocar muita ênfase no uso do interno [[Class]]. Em vez disso, apenas para usá-lo como um vislumbre tangível de como os implementadores interpretaram os diferentes tipos de objetos. Então, window.alertter um interno [[Class]]de "Function"parece ser uma violação do ES 5?
user113716,
Estou tentando ver isso em ação, mas se obtiver o tipo desse div,, divs/NodeListobtenho um object. Suponho que ainda não entendo isso, mas isso não o tornaria um objeto nativo?
Mark B
Isso é útil . Colocar tudo em windowmostra todos os objetos de host
Marcos B
Bird não é um objeto nativo porque sua interface não está totalmente descrita no padrão ECMASCript. É realmente simples assim. O objeto é nativo e String é nativo, mas os objetos definidos pelo usuário ou pelo host não são nativos.
Scott Marcus
3

Não foi possível ver uma resposta convincente para a pergunta se var bird1 = new Bird();é um objeto nativo ou host. Assumindo que Bird é uma função definida pelo usuário, um objeto não embutido nativo será criado de acordo com http://es5.github.io/#x13.2 pela implementação de javascript. Em contraste, nativo integradoos objetos estarão presentes desde o início de um programa javascript (como Object e muitos outros). Uma diferença entre um objeto nativo e um objeto host é que o primeiro é criado pela implementação de javascript e o último é fornecido pelo ambiente host. Como resultado, a propriedade interna [[classe]] do objeto host pode ser diferente daquelas usadas pelos objetos integrados (ou seja, "Argumentos", "Matriz", "Booleano", "Data", "Erro", "Função", " JSON "," Math "," Number "," Object "," RegExp "e" String ").

Além disso, vale a pena observar que ECMA6 http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf não usa mais a terminologia nativa e objetos de host. Em vez disso, ele define os tipos de objeto abaixo, com explicações mais claras de seu comportamento pretendido.

4.3.6 objeto comum

objeto que tem o comportamento padrão para os métodos internos essenciais que devem ser suportados por todos os objetos

4.3.7 objeto exótico

objeto que não tem o comportamento padrão para um ou mais dos métodos internos essenciais que devem ser suportados por todos os objetos NOTA Qualquer objeto que não seja um objeto comum é um objeto exótico.

4.3.8 objeto padrão

objeto cuja semântica é definida por esta especificação

4.3.9 objeto embutido

objeto especificado e fornecido por uma implementação ECMAScript

jaaw
fonte
3

Além das outras respostas relacionadas aos Objetos de Host.

Os objetos de host são específicos de um ambiente. Assim, ao lado dos objetos de host do navegador, também existem objetos específicos para nodejs.

Por causa do exemplo, primeiro começando com os objetos Padrão conforme definidos em Javascript. Em seguida, os objetos comuns para o navegador / DOM. O Node tem seus próprios objetos.

  1. Exemplos de objetos internos de Javascript padrão :

  2. Exemplos de modelo de objeto de documento de objetos host :

  3. Objetos de host em Node.js :

Remi
fonte
1

Considerando três objetos: Host, Native, Custom.

Objetos de host são criados pelo ambiente e são específicos do ambiente. O ambiente mais conhecido seria um navegador da web, mas poderia ser outra plataforma. Os objetos de host criados no navegador da web podem ser o objeto de janela ou o documento. Normalmente, um navegador usa uma API para criar objetos de host para refletir o modelo de objeto de documento em JavaScript. (Webbrowser tem diferentes mecanismos de JavaScript que fazem isso) Um objeto de host é criado automaticamente no momento em que a página é renderizada em um navegador.

Um objeto nativo é criado pelo desenvolvedor usando classes predefinidas de JavaScript. Objetos nativos estão em seu script escrito.

Então, um objeto personalizado é feito pelo desenvolvedor a partir de uma classe personalizada (não predefinida ou parcialmente predefinida).

Khamaseen
fonte
0

Objetos nativos são objetos que seguem as especificações, ou seja, "objetos padrão".

Objetos de host são objetos que o navegador (ou outro ambiente de tempo de execução como o Node) fornece.

A maioria dos objetos de host são objetos nativos e sempre que você instanciar algo usando new, você pode ter 99,99% de certeza de que é um objeto nativo, a menos que você mexa com objetos de host estranhos.

Esta noção foi introduzida devido à presença de objetos muito bizarros no IE (e em outros navegadores antigos?) . Por exemplo:

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

Ao ver isso, todos concordariam que document.allé claramente "não padrão" e, portanto, um objeto de host não nativo .

Então, por que não chamar os objetos nativos de objetos padrão em primeiro lugar? Simples: afinal, o documento Padrão (!) Também fala sobre objetos não nativos, e chamá-los de não padrão levaria a um paradoxo.

Novamente:

  • nativo == "padrão"
  • host == fornecido pelo navegador ou Nó ou ...
  • a maioria dos objetos host são nativos e todos os objetos não host também são nativos
user123444555621
fonte
Você saiu dos trilhos um pouco. "A maioria dos objetos de host são nativos" está incorreto. Na verdade, por definição, TODOS os objetos de host NÃO são nativos. Nativo significa "padrão" com certeza, mas significa padrão na especificação do idioma, não padrão no sentido de fora do comum. JavaScript (ECMASCript) define várias interfaces / APIs que são implementadas por navegadores e outros hosts, como: String, Date, MATH, Boolean, Number, JSON e XmlHTTP. Esses objetos estão disponíveis porque o host implementa um mecanismo compatível com ECMAScript e atende ao padrão ECMA.
Scott Marcus
0

Isso pode ser um exagero, mas para simplificar, um objeto nativo é aquele que existe e pode ser usado em qualquer ambiente que implemente um mecanismo compatível com ECMAScript. Geralmente (mas nem sempre) é um navegador.

Portanto, seu Internet Explorer ou seu Google Chrome, não disponibiliza o objeto String para você, por exemplo. O motivo pelo qual você pode usar o objeto String é porque ele é "nativo" (integrado) à própria linguagem JavaScript.

No entanto, se quiser criar uma janela pop-up, você precisará usar o objeto janela. O objeto de janela é fornecido pelo próprio software do navegador, portanto, não é nativo do JavaScript, mas faz parte do "Modelo de objeto do navegador" ou do BOM.

Scott Marcus
fonte