1

私は現在、標準に準拠した (HTML5、CSS3、ESv5) ライブラリを構築することを目的として、高度な JavaScript を学習しています。途中で、どこから始めるべきか、何をすべきか、何をすべきでないか、何を避けるべきかなどを把握するために、すでにいくつかの関連する質問をしました。私はすでに ECMA-262 (ECMAScript バージョン 5) のドキュメントを読み始めています。 、開発作業を開始する前に、いくつかのテストを実行しています。

以前の質問:

ECMAScript5 準拠のコードを書く

JavaScript、JScript、および ECMAScript の違いは何ですか?

私の調査では、ブラウザーが異なれば標準の実装も異なり、その点で、実装するオブジェクトも異なることがわかりました。たとえば、IE は ActiveXObject というオブジェクトを実装していますが、FireFox ではそうではありません。そこで、ブラウザ内で何かが定義されているかどうかを判断する小さなテスト機能を作成しました。

いくつかの既知のオブジェクトをテストする以下を検討してください (これは組み込まれていないため、jQuery を含みます)。

ブラウザ機能テスト機能

繰り返しますが、私は助けが必要なポイントに達しました:

質問:

  1. 上記の例では、オブジェクトと関数の違いは何ですか?

  2. ES/JS で関数またはオブジェクトを記述しますか?

  3. Object がオブジェクトではなく関数であるのはなぜですか?

  4. オブジェクト/関数に組み込まれた階層構造はありますか?

  5. 組み込みオブジェクト/関数をまったく別のものとして再定義できますか?

  6. 組み込みオブジェクト/関数を未定義にすることはできますか?

  7. ネイティブでサポートされていない場合、組み込みオブジェクト/関数に新しい機能を割り当てることはできますか?

  8. オブジェクトが 1 つのブラウザーで定義され、別のブラウザーでは定義されていない場合、これをどのように補正できますか?

PS 特定の実装 (JavaScript/JScript) に関する回答ではなく、標準 (ECMAScript v5) に関する回答が必要です。前もって感謝します!

4

3 に答える 3

2

上記の例では、オブジェクトと関数の違いは何ですか?

関数は、呼び出し可能な単なるオブジェクトです。ただし、ホストオブジェクトのタイプ(Nodeなど)を尋ねると思いますHTMLCollection。それらの動作は実装に依存します(「ecmascriptネイティブではない」)-何にも依存することはできません。

ES / JSで関数やオブジェクトを記述しますか?

は?解釈できるコードを記述します。

オブジェクトがオブジェクトではなく関数であるのはなぜですか?

Objectはネイティブオブジェクトコンストラクタであり、したがって関数(およびオブジェクト)です。

組み込みのオブジェクト/関数に階層構造はありますか?

「すべてがである」とお願いしますか?DOMインターフェイスの構造を尋ねる場合:これらは実装に依存するホストオブジェクトですが、ほとんどの実装者はDOM仕様に基づく継承システムを持っています。

組み込みのオブジェクト/関数をまったく異なるものとして再定義できますか?組み込みのオブジェクト/関数を未定義にすることはできますか?

いいえ。それらを指すグローバル変数(グローバルオブジェクトのプロパティ)を上書きできますが、それでもすべてのインスタンスはネイティブ([ほぼ]アクセスできない)コンストラクターから構築されます。

組み込みのオブジェクト/関数がまだネイティブにサポートされていない場合、それらに新しい機能を割り当てることはできますか?オブジェクトが別のブラウザではなく1つのブラウザで定義されている場合、これをどのように補正できますか?

はい、ネイティブオブジェクトとそのプロトタイプを拡張できます。しかし、ホストオブジェクトに気をつけてください。彼らはそれを気に入らないかもしれません。オブジェクトが特定の環境でのみ定義されている場合は、その存在を簡単にテストして、場合によってはシムすることができます(es5html5)。

于 2012-08-22T20:16:36.947 に答える
2

上記の例では、オブジェクトと関数の違いは何ですか?

Chrome では、これらの項目はすべて関数です。ただし、一般に、関数はコードを保持し、呼び出すことができるオブジェクトです。したがって、関数にプロパティを追加することもできます (jQuery のように:$("selector")または$.ajax)。

ES/JS で関数またはオブジェクトを記述しますか?

明らかに、それはあなたがコーディングする内容に依存します。function() {}関数を提供します。{}オブジェクトを与えます。(繰り返しますが、関数は最終的にはオブジェクトです。)

Object がオブジェクトではなく関数であるのはなぜですか?

Objectコンストラクターとして、またはそうでなくても呼び出すことができるため、関数です。

Object();      // returns an empty object
new Object();  // same

また、ほとんどすべてが のインスタンスであることを考えると、ObjectObjectコンストラクタであり、したがって関数であるということになります。(関数もオブジェクトであることに注意してください。)

オブジェクト/関数に組み込まれた階層構造はありますか?

ECMAScript 組み込みオブジェクトに関しては、ある意味ではあります。グローバル オブジェクトのコンストラクタ関数 ( String)、インスタンスの関数 ( Array.prototype.forEach)、および「静的」関数 (Object.definePropertyオブジェクトやArray.isArray配列で使用するためのもの) があります。

組み込みオブジェクト/関数をまったく別のものとして再定義できますか?

もちろん、できますObject = null。ただし、依存しているコードObjectは例外をスローし始めるため、まったくお勧めしません。

組み込みオブジェクト/関数を未定義にすることはできますか?

いいえ、オブジェクトは定義上未定義ではありません。undefinedはオブジェクトではなく、その逆も同様です。これは、どのオブジェクトにも当てはまります。

ネイティブでサポートされていない場合、組み込みオブジェクト/関数に新しい機能を割り当てることはできますか?

はい、egArray.prototype.forEachが存在しない場合は、自分で設定できます。for(var key in arr)ただし、そのような関数はループ内で発生し、コードの動作が異なる可能性があることに注意してください。Object.definePropertyこれは、 を使用して解決できます{enumerable: false}。ただし、別の注意点があります。関数は環境全体 (現在のページなど) で共有されます。他のコードもそれらを設定している場合、衝突が発生しています。

オブジェクトが 1 つのブラウザーで定義され、別のブラウザーでは定義されていない場合、これをどのように補正できますか?

そのような関数を「シム」することができます。たとえばArray.prototype.forEach、古いブラウザでも利用できるようにする shim などの ES5 関数があります。Underscore.js が良い例かもしれません。

于 2012-08-22T19:53:33.963 に答える
0

ECMAScript / JavaScript に関する調査の一環として、JS DOM に関する多くの情報を提供する次のリソースを見つけました。

http://krook.org/jsdom/index-all.html

于 2012-09-03T08:33:04.127 に答える