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 ();)?
javascript
ppecher
fonte
fonte
new Image()
- é um objeto host, por exemplo.:)
Respostas:
Ambos os termos são definidos na especificação ECMAScript:
Fonte: http://es5.github.com/#x4.3.6
Fonte: http://es5.github.com/#x4.3.8
Alguns exemplos:
Objetos nativos:
Object
(construtor),Date
,Math
,parseInt
,eval
, métodos de corda comoindexOf
ereplace
, métodos de matriz, ...Objetos de host (assumindo ambiente do navegador):
window
,document
,location
,history
,XMLHttpRequest
,setTimeout
,getElementsByTagName
,querySelectorAll
, ...fonte
host object
descrita nesta resposta .'Object'
, ou apresentada viaObject.prototype.toString
como'[object Object]'
.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 onew
operador, etc, etc, etc) é um objeto nativo ... posso deixar uma resposta ...É mais claro se distinguirmos entre três tipos de objetos:
Objetos internos :
String
,Math
,RegExp
,Object
,Function
etc. - 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.
fonte
Aqui está meu entendimento da especificação.
Este:
... resulta em um objeto nativo que simplesmente aconteceu de ser criado usando o
new
operador.Objetos nativos têm uma propriedade interna [[Class]] de um dos seguintes:
Para você
bird1
será:Assim como se você criasse uma função:
...
my_func
não está definido no ECMAScript, mas ainda é um objeto nativo com o interno [[Class]]: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:
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]] é:
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.
fonte
bird
eBird
sã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 exemplowindow.alert
tem"Function"
como valor de sua[[Class]]
propriedade quase todas as implementações, no IE tem"Object"
, e ainda é um objeto hospedeiro ...[[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.alert
ter um interno[[Class]]
de"Function"
parece ser uma violação do ES 5?divs/NodeList
obtenho umobject
. Suponho que ainda não entendo isso, mas isso não o tornaria um objeto nativo?window
mostra todos os objetos de hostNã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.
fonte
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.
Exemplos de objetos internos de Javascript padrão :
Exemplos de modelo de objeto de documento de objetos host :
Objetos de host em Node.js :
fonte
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).
fonte
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:
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:
fonte
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.
fonte