ネイティブオブジェクトとホストオブジェクトの違いは何ですか?


90

後者は、カスタムコンストラクターによって作成された非プリミティブ関数オブジェクトを単に参照するだけですか(例:var bird1 = new Bird();)?


2
ネイティブオブジェクトはECMAScript仕様で定義されていますが、ホストオブジェクトは定義されていません。
–ŠimeVidas、2011

6
たとえば、DOM要素new Image()はホストオブジェクトです。

@ŠimeVidas:自分の答えと矛盾するコメントを残した理由はありますか?
user113716 2011

今、私のことだӪ_._Ӫ@:)
サイムVIDAS

1
@ŠimeVidas:コメントには、ホストオブジェクトがECMAScript仕様で定義されていないことが記載されています。あなたの答えは「両方の定義はECMAScript仕様にある」と述べています。
user113716 2011

回答:


133

どちらの用語もECMAScript仕様で定義されています。

ネイティブオブジェクト

セマンティクスがホスト環境ではなくこの仕様によって完全に定義されているECMAScript実装のオブジェクト。

注標準のネイティブオブジェクトは、この仕様で定義されています。一部のネイティブオブジェクトは組み込みです。ECMAScriptプログラムの実行中に構築されるものもあります。

ソース:http : //es5.github.com/#x4.3.6

ホストオブジェクト

ECMAScriptの実行環境を完成させるためにホスト環境によって提供されるオブジェクト。

注ネイティブではないオブジェクトはすべてホストオブジェクトです。

出典:http : //es5.github.com/#x4.3.8


いくつかの例:

ネイティブオブジェクト:Object(コンストラクタ)、 、DateMathparseInteval文字列のような方法indexOfreplace、配列方法、...

ホスト・オブジェクト(ブラウザ環境を想定): 、windowdocumentlocationhistoryXMLHttpRequest、、setTimeout 、...getElementsByTagNamequerySelectorAll


8
彼にもいくつかの例を挙げてください。ネイティブオブジェクト:配列、文字列..、ホストオブジェクト:ウィンドウ...
Poelinca Dorin

1
カスタムカストはどうですか?たとえば、私の投稿の鳥の例
ppecher '30

2
@ŠimeVidas:「ホストオブジェクトです。」不正解です。この回答host object説明されているの定義を参照してください。
user113716 2011

1
ŠimeVidas:しかし、仕様では、ホストオブジェクトの[[Class]]内部プロパティの値は、「引数」、「配列」、「ブール」、「日付」、「エラー」のいずれかを除く任意の文字列値である可能性があります。 「関数」、「JSON」、「数学」、「数値」、「オブジェクト」、「RegExp」、および「文字列」。Birdオブジェクトの内部[[Class]]プロパティは'Object'、またはObject.prototype.toStringとして表示され'[object Object]'ます。
user113716 2011

2
@ŠimeVidas、私は同意しません、Birdユーザー定義関数である場合、そのセマンティクスはES仕様によって「完全に定義」されています(関数オブジェクトの動作方法、作成方法、実行方法、newオペレーターでの使用方法など)。ネイティブオブジェクト ...私は...答えを落とすかもしれない
クリスチャンC.Salvadó

28

3種類のオブジェクトを区別すると、より明確になります。

ビルトインオブジェクトStringMathRegExpObjectFunctionなど- JavaScriptで常にコアの定義済みオブジェクト利用できます。ECMAScript仕様で定義されています。

ホストオブジェクト:ようなオブジェクトwindowXmlHttpRequestブラウザ環境によって提供されるように、DOMノードと、。すべての環境が同じホストオブジェクトを持つわけではないため、これらは組み込みオブジェクトとは異なります。JavaScriptがブラウザーの外で、たとえばNode.jsのようなサーバー側スクリプト言語として実行される場合、さまざまなホストオブジェクトを使用できます。

ユーザーオブジェクト:JavaScriptコードで定義されたオブジェクト。したがって、例の「鳥」はユーザーオブジェクトになります。

JavaScript仕様では、組み込みオブジェクトとユーザーオブジェクトをネイティブオブジェクトとしてグループ化しています。ユーザーオブジェクトは明らかにJavaScriptで実装されますが、組み込みオブジェクトはホストオブジェクトと同じように内部で別の言語で実装される可能性が高いため、これは「ネイティブ」という用語の通常ではない使用法です。ただし、JavaScript仕様の観点から見ると、組み込みオブジェクトとユーザーオブジェクトはどちらもJavaScript仕様で定義されているため、JavaScriptにネイティブですが、ホストオブジェクトはそうではありません。


ネイティブオブジェクトとは、JavaScriptの実装(エンジン)によって作成されたオブジェクトを指します。組み込みオブジェクトと他のネイティブオブジェクト(ユーザーオブジェクト)の違いは、関連するECMAルールに準拠したJavaScriptプログラムの開始以降、以前のオブジェクトが存在することです。ECMA6(<ECMA6ecma-international.org/publications/files/ECMA-ST/… )なので、オブジェクトの分類に上記の用語を使用していません。以下の私の答えを参照してください。
jaaw 2016年

17

これが私の仕様の理解です。

この:

var bird = new Bird();

...結果は、たまたまnew演算子を使用して作成されただけのネイティブオブジェクトになります。

ネイティブオブジェクトには、次のいずれかの内部[[Class]]プロパティがあります。

「引数」、「配列」、「ブール」、「日付」、「エラー」、「関数」、「JSON」、「数学」、「数値」、「オブジェクト」、「RegExp」、および「文字列」

あなたbird1にとっては:

「オブジェクト」

関数を作成する場合と同じように:

function my_func() {
    // ...
}

... my_funcはECMAScriptで定義されていませんが、内部[[クラス]]を持つネイティブオブジェクトです。

"関数"

ホストオブジェクトは、仕様で定義されていない環境に対して特定の目的を果たすために、環境によって提供されるオブジェクトです。

例えば:

var divs = document.getElementsByTagName('div')

によって参照されるオブジェクトdivsNodeListです。これは、通常のJavaScriptオブジェクトのように感じられるように環境に統合されていますが、仕様ではどこにも定義されていません。

その内部[[Class]]プロパティは次のとおりです。

「NodeList」

これにより、実装の設計者は、実装を環境の特定のニーズに適合させる際にある程度の柔軟性を提供します。

仕様全体で定義されているホストオブジェクトの要件があります。


2
+1は、私はあなたに同意、birdBirdされているネイティブオブジェクトを、彼らは、ユーザー定義関数(ある、Bird)、およびオブジェクト(birdコンストラクタとしての機能を利用して作成した)、このすべての意味は、スペック上で定義されています。ホストオブジェクト、にあまり依存しない[[Class]]内部プロパティ、たとえばがwindow.alertあり"Function"、その値として[[Class]]プロパティのほぼすべての実装、IE上でそれが持っている"Object"、そしてそれはまだホストオブジェクトです...
クリスチャンC.Salvadó

@CMSに感謝します。ええ、私は内部の使用にあまり重点を置くつもりはありませんでした[[Class]]。むしろ、実装者がさまざまなタイプのオブジェクトをどのように解釈したかを具体的に垣間見るために使用するだけです。それではwindow.alert、内部にES 5の違反があるように見える[[Class]]"Function"でしょうか?
user113716 '10

このainアクションを確認しようとしていますが、そのdivのtypeof divs/NodeListを取得すると、を取得しobjectます。私はまだこれを理解していないと思いますが、それはそれをネイティブオブジェクトにしないのではないでしょうか?
マークB

これは役に立ちます。すべてを取得すると、windowすべてのホストオブジェクトが表示されます
マークB 14

Birdは、そのインターフェースがECMASCript標準で完全に記述されていないため、ネイティブオブジェクトではありません。とても簡単です。オブジェクトはネイティブで、文字列はネイティブですが、ユーザー定義またはホスト定義のオブジェクトはネイティブではありません。
スコットマーカス

3

var bird1 = new Bird();ネイティブオブジェクトかホストオブジェクトかという質問に対する説得力のある回答が見つかりませんでした。Birdがユーザー定義の関数であるとすると、JavaScriptの実装により、ネイティブの非組み込みオブジェクトがhttp://es5.github.io/#x13.2に従って作成されます。対照的に、ネイティブの組み込みオブジェクトは、JavaScriptプログラムの開始以降存在します(Objectなど多くのオブジェクト)。ネイティブオブジェクトとホストオブジェクトの違いは、前者はJavaScriptの実装によって作成され、後者はホスト環境によって提供されることです。その結果、ホストオブジェクトの内部[[class]]プロパティは、組み込みオブジェクトで使用されるものとは異なる可能性があります(つまり、「引数」、「配列」、「ブール」、「日付」、「エラー」、「関数」、「 JSON」、「Math」、「Number」、「Object」、「RegExp」、および「String」)。

また、ECMA6 http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdfでは、ネイティブおよびホストオブジェクトという用語が使用されなくなったことにも注目してください。代わりに、以下のオブジェクトタイプを定義し、それらの意図された動作をより明確に説明します。

4.3.6通常のオブジェクト

すべてのオブジェクトによってサポートされる必要がある必須の内部メソッドのデフォルトの動作を持つオブジェクト

4.3.7エキゾチックなオブジェクト

すべてのオブジェクトでサポートする必要のある1つ以上の必須の内部メソッドのデフォルトの動作を持たないオブジェクト注通常のオブジェクトではないオブジェクトは、エキゾチックオブジェクトです。

4.3.8標準オブジェクト

この仕様でセマンティクスが定義されているオブジェクト

4.3.9組み込みオブジェクト

ECMAScript実装によって指定および提供されるオブジェクト


3

ホストオブジェクトに関する他の回答に加えて。

ホストオブジェクトは環境に固有です。したがって、ブラウザのホストオブジェクトの次に、nodejsに固有のオブジェクトもあります。

例として、まずJavaScriptで定義された標準オブジェクトから始めます。次に、ブラウザ/ DOMの共通オブジェクト。ノードには独自のオブジェクトがあります。

  1. 標準のJavaScript組み込みオブジェクトの例:

  2. ホストオブジェクトドキュメントオブジェクトモデルの例:

  3. Node.jsのホストオブジェクト:


1

3つのオブジェクト、ホスト、ネイティブ、カスタムを検討します。

ホストオブジェクトは環境によって作成され、環境固有です。最もよく知られている環境はWebブラウザですが、別のプラットフォームである可能性もあります。Webブラウザで作成されたホストオブジェクトは、ウィンドウオブジェクトまたはドキュメントである可能性があります。通常、ブラウザはAPIを使用してホストオブジェクトを作成し、ドキュメントオブジェクトモデルをJavaScriptに反映します。(Webブラウザーには、これを行うさまざまなJavaScriptエンジンがあります)ホストオブジェクトは、ブラウザーでページがレンダリングされるときに自動的に作成されます。

ネイティブオブジェクトは、JavaScriptの定義済みクラスを使用して開発者が作成します。ネイティブオブジェクトは、作成したスクリプト内にあります。

カスタムオブジェクトは、開発者によってカスタム(事前定義されていない、または部分的に事前定義されていない)クラスから作成されます。


0

ネイティブオブジェクトは、仕様に準拠したオブジェクト、つまり「標準オブジェクト」です。

ホストオブジェクトは、ブラウザ(またはNodeのような他のランタイム環境)が提供するオブジェクトです。

ほとんどのホストオブジェクトはネイティブオブジェクトでありnew、を使用して何かをインスタンス化するときは常に、奇妙なホストオブジェクトをいじらない限り、99.99%でネイティブオブジェクトであると確信できます。

この概念は、IE (および他の古いブラウザー?)に非常に奇妙なオブジェクトが存在するために導入されました。例えば:

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

これを見ると、それdocument.allは明らかに「非標準」であり、したがって非ネイティブホストオブジェクトであることに誰もが同意するでしょう。

そもそもなぜネイティブオブジェクトを標準オブジェクトと呼ばないのでしょうか。シンプル:結局のところ、Standard(!)ドキュメントは非ネイティブオブジェクトについても話し、非標準オブジェクトを非標準と呼ぶとパラドックスにつながります。

再び:

  • ネイティブ== "標準"
  • host ==ブラウザまたはノードによって提供されるか…
  • ほとんどのホストオブジェクトはネイティブであり、すべての非ホストオブジェクトもネイティブです

少しレールから外れました。「ほとんどのホストオブジェクトはネイティブです」は正しくありません。実際、定義上、すべてのホストオブジェクトはネイティブではありません。ネイティブは確かに「標準」を意味しますが、言語仕様における標準を意味し、通常とは異なる意味での標準ではありません。JavaScript(ECMASCript)は、文字列、日付、MATH、ブール値、数値、JSON、XmlHTTPなど、ブラウザやその他のホストによって実装されるいくつかのインターフェース/ APIを定義します。ホストがECMAScript準拠のエンジンを実装し、ECMA標準を満たすため、これらのオブジェクトを使用できます。
スコットマーカス

0

これはやり過ぎかもしれませんが、簡単にするために、ネイティブオブジェクトは存在し、ECMAScript準拠のエンジンを実装する任意の環境で使用できるオブジェクトです。これは通常(常にではない)ブラウザーです。

したがって、たとえばInternet ExplorerやGoogle Chromeでは、Stringオブジェクトを利用できません。Stringオブジェクトを使用できるのは、それがJavaScript言語自体に「ネイティブ」(組み込み)であるためです。

ただし、ポップアップウィンドウを作成する場合は、ウィンドウオブジェクトを使用する必要があります。ウィンドウオブジェクトはブラウザソフトウェア自体によって提供されるため、JavaScriptにネイティブではありませんが、「ブラウザオブジェクトモデル」またはBOMの一部です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.