後者は、カスタムコンストラクターによって作成された非プリミティブ関数オブジェクトを単に参照するだけですか(例:var bird1 = new Bird();)?
:)
後者は、カスタムコンストラクターによって作成された非プリミティブ関数オブジェクトを単に参照するだけですか(例:var bird1 = new Bird();)?
:)
回答:
どちらの用語もECMAScript仕様で定義されています。
ネイティブオブジェクト
セマンティクスがホスト環境ではなくこの仕様によって完全に定義されているECMAScript実装のオブジェクト。
注標準のネイティブオブジェクトは、この仕様で定義されています。一部のネイティブオブジェクトは組み込みです。ECMAScriptプログラムの実行中に構築されるものもあります。
ソース:http : //es5.github.com/#x4.3.6
ホストオブジェクト
ECMAScriptの実行環境を完成させるためにホスト環境によって提供されるオブジェクト。
注ネイティブではないオブジェクトはすべてホストオブジェクトです。
出典:http : //es5.github.com/#x4.3.8
いくつかの例:
ネイティブオブジェクト:Object(コンストラクタ)、 、Date、Math、parseInt、eval文字列のような方法indexOfとreplace、配列方法、...
ホスト・オブジェクト(ブラウザ環境を想定): 、window、document、location、history、XMLHttpRequest、、setTimeout 、...getElementsByTagNamequerySelectorAll
'Object'、またはObject.prototype.toStringとして表示され'[object Object]'ます。
Birdユーザー定義関数である場合、そのセマンティクスはES仕様によって「完全に定義」されています(関数オブジェクトの動作方法、作成方法、実行方法、newオペレーターでの使用方法など)。ネイティブオブジェクト ...私は...答えを落とすかもしれない
3種類のオブジェクトを区別すると、より明確になります。
ビルトインオブジェクト:String、Math、RegExp、Object、Functionなど- JavaScriptで常にコアの定義済みオブジェクト利用できます。ECMAScript仕様で定義されています。
ホストオブジェクト:ようなオブジェクトwindow、XmlHttpRequestブラウザ環境によって提供されるように、DOMノードと、。すべての環境が同じホストオブジェクトを持つわけではないため、これらは組み込みオブジェクトとは異なります。JavaScriptがブラウザーの外で、たとえばNode.jsのようなサーバー側スクリプト言語として実行される場合、さまざまなホストオブジェクトを使用できます。
ユーザーオブジェクト:JavaScriptコードで定義されたオブジェクト。したがって、例の「鳥」はユーザーオブジェクトになります。
JavaScript仕様では、組み込みオブジェクトとユーザーオブジェクトをネイティブオブジェクトとしてグループ化しています。ユーザーオブジェクトは明らかにJavaScriptで実装されますが、組み込みオブジェクトはホストオブジェクトと同じように内部で別の言語で実装される可能性が高いため、これは「ネイティブ」という用語の通常ではない使用法です。ただし、JavaScript仕様の観点から見ると、組み込みオブジェクトとユーザーオブジェクトはどちらもJavaScript仕様で定義されているため、JavaScriptにネイティブですが、ホストオブジェクトはそうではありません。
これが私の仕様の理解です。
この:
var bird = new Bird();
...結果は、たまたまnew演算子を使用して作成されただけのネイティブオブジェクトになります。
ネイティブオブジェクトには、次のいずれかの内部[[Class]]プロパティがあります。
「引数」、「配列」、「ブール」、「日付」、「エラー」、「関数」、「JSON」、「数学」、「数値」、「オブジェクト」、「RegExp」、および「文字列」。
あなたbird1にとっては:
「オブジェクト」
関数を作成する場合と同じように:
function my_func() {
// ...
}
... my_funcはECMAScriptで定義されていませんが、内部[[クラス]]を持つネイティブオブジェクトです。
"関数"
ホストオブジェクトは、仕様で定義されていない環境に対して特定の目的を果たすために、環境によって提供されるオブジェクトです。
例えば:
var divs = document.getElementsByTagName('div')
によって参照されるオブジェクトdivsはNodeListです。これは、通常のJavaScriptオブジェクトのように感じられるように環境に統合されていますが、仕様ではどこにも定義されていません。
その内部[[Class]]プロパティは次のとおりです。
「NodeList」
これにより、実装の設計者は、実装を環境の特定のニーズに適合させる際にある程度の柔軟性を提供します。
仕様全体で定義されているホストオブジェクトの要件があります。
birdとBirdされているネイティブオブジェクトを、彼らは、ユーザー定義関数(ある、Bird)、およびオブジェクト(birdコンストラクタとしての機能を利用して作成した)、このすべての意味は、スペック上で定義されています。ホストオブジェクト、にあまり依存しない[[Class]]内部プロパティ、たとえばがwindow.alertあり"Function"、その値として[[Class]]プロパティのほぼすべての実装、IE上でそれが持っている"Object"、そしてそれはまだホストオブジェクトです...
[[Class]]。むしろ、実装者がさまざまなタイプのオブジェクトをどのように解釈したかを具体的に垣間見るために使用するだけです。それではwindow.alert、内部にES 5の違反があるように見える[[Class]]の"Function"でしょうか?
divs/NodeListを取得すると、を取得しobjectます。私はまだこれを理解していないと思いますが、それはそれをネイティブオブジェクトにしないのではないでしょうか?
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実装によって指定および提供されるオブジェクト
ホストオブジェクトに関する他の回答に加えて。
ホストオブジェクトは環境に固有です。したがって、ブラウザのホストオブジェクトの次に、nodejsに固有のオブジェクトもあります。
例として、まずJavaScriptで定義された標準オブジェクトから始めます。次に、ブラウザ/ DOMの共通オブジェクト。ノードには独自のオブジェクトがあります。
標準のJavaScript組み込みオブジェクトの例:
ホストオブジェクトドキュメントオブジェクトモデルの例:
Node.jsのホストオブジェクト:
3つのオブジェクト、ホスト、ネイティブ、カスタムを検討します。
ホストオブジェクトは環境によって作成され、環境固有です。最もよく知られている環境はWebブラウザですが、別のプラットフォームである可能性もあります。Webブラウザで作成されたホストオブジェクトは、ウィンドウオブジェクトまたはドキュメントである可能性があります。通常、ブラウザはAPIを使用してホストオブジェクトを作成し、ドキュメントオブジェクトモデルをJavaScriptに反映します。(Webブラウザーには、これを行うさまざまなJavaScriptエンジンがあります)ホストオブジェクトは、ブラウザーでページがレンダリングされるときに自動的に作成されます。
ネイティブオブジェクトは、JavaScriptの定義済みクラスを使用して開発者が作成します。ネイティブオブジェクトは、作成したスクリプト内にあります。
カスタムオブジェクトは、開発者によってカスタム(事前定義されていない、または部分的に事前定義されていない)クラスから作成されます。
ネイティブオブジェクトは、仕様に準拠したオブジェクト、つまり「標準オブジェクト」です。
ホストオブジェクトは、ブラウザ(またはNodeのような他のランタイム環境)が提供するオブジェクトです。
ほとんどのホストオブジェクトはネイティブオブジェクトでありnew、を使用して何かをインスタンス化するときは常に、奇妙なホストオブジェクトをいじらない限り、99.99%でネイティブオブジェクトであると確信できます。
この概念は、IE (および他の古いブラウザー?)に非常に奇妙なオブジェクトが存在するために導入されました。例えば:
typeof document.all == "undefined"; // true
document.all.myElementId; // object
これを見ると、それdocument.allは明らかに「非標準」であり、したがって非ネイティブホストオブジェクトであることに誰もが同意するでしょう。
そもそもなぜネイティブオブジェクトを標準オブジェクトと呼ばないのでしょうか。シンプル:結局のところ、Standard(!)ドキュメントは非ネイティブオブジェクトについても話し、非標準オブジェクトを非標準と呼ぶとパラドックスにつながります。
再び:
これはやり過ぎかもしれませんが、簡単にするために、ネイティブオブジェクトは存在し、ECMAScript準拠のエンジンを実装する任意の環境で使用できるオブジェクトです。これは通常(常にではない)ブラウザーです。
したがって、たとえばInternet ExplorerやGoogle Chromeでは、Stringオブジェクトを利用できません。Stringオブジェクトを使用できるのは、それがJavaScript言語自体に「ネイティブ」(組み込み)であるためです。
ただし、ポップアップウィンドウを作成する場合は、ウィンドウオブジェクトを使用する必要があります。ウィンドウオブジェクトはブラウザソフトウェア自体によって提供されるため、JavaScriptにネイティブではありませんが、「ブラウザオブジェクトモデル」またはBOMの一部です。