16

私は現在、主に Visual Studio 2010 と JetBrains WebStorm を使用して JavaScript 用の API を構築しています (防弾 JavaScript IDE を探している場合に最適です)。

Visual Studio で IntelliSense リストを調べているときに (JavaScript API に慣れようとして)、 と の両方が存在することに気付きDocumentましたdocument

  1. Documentとはどう違いdocumentますか?
  2. document(存在する場合) のインスタンスは何ですか?
  3. どのように使用しますかDocument(関数ではないため、構築可能ではないため)?
  4. Document最も重要なのは、それを構築可能にするための「モンキーパッチ」の害は何ですか?

Documentこれらの質問の背後にある理論的根拠は、API に適合するいくつかのオブジェクト (たとえば、; など) を作成したいということですHTMLElementが、これらは何らかの点で既に存在しているように見えるため、ネイティブを上書きする必要があるかどうか確信が持てません。実装。

4

2 に答える 2

17

Documentとはどう違いdocumentますか?

document(またはwindow.document) は、ウィンドウに含まれるドキュメントへの参照です。(スペック)

Documentグローバル オブジェクトで公開される、ドキュメントの DOM インターフェイスです。(スペックスペック)

どのように使用しますかDocument(関数ではないため、構築可能ではないため)?

これはホスト オブジェクトであり、EcmaScript 仕様に従う必要はありませんが、関数ではないという意味ではありません。ブラウザによっても異なる場合があります。ただし、呼び出されることを意図したものではありません (試してみると、 が返されますNOT_SUPPORTED_ERR)。新しいドキュメントをインスタンス化/取得する方法は他にもあります。まだまだ使えるのは

> document instanceof Document
true
> Document.prototype
DocumentPrototype {
    adoptNode: Function
    constructor: Document
    createAttribute: Function
    …
    querySelector: Function
    querySelectorAll: Function
}
|- NodePrototype
|- Object

したがって、そのプロトタイプを拡張し、それらのメソッドをすべてXMLDocuments/アプリで使用できます (ただし、 DOM の拡張の何が問題なのHTMLDocumentsかを知っている場合のみ)。

Document最も重要なことは、それを構築可能にするための「モンキーパッチ」の害は何ですか?

どうやってそれをするのかわかりません。それを上書きすると、上記のように動作することを期待するすべてのスクリプトに害を及ぼす可能prototype性があります (新しい関数のプロパティを修正しない限り)。また、一部の環境では のDocumentプロパティがwindow書き込み不可である可能性があるため、自分自身を傷つける可能性があります。

于 2013-05-28T11:12:23.633 に答える
1
  1. Documentdocumentは、グローバル スコープのオブジェクトのプロトタイプ定義であり、Documentのプロトタイプがインスタンス ( ) と共有されていることを意味しますdocument。likeは、オブジェクトWindowのプロトタイプ定義です。window
  2. はネイティブのプロトタイプ オブジェクトであり、そのDocumentインスタンスを作成することはできません。シングル トーン オブジェクトと同様に、ページが作成されるときに (ウィンドウのように) 1 つのインスタンスのみが作成されます。
  3. Documentをオーバーライドすることは良い習慣になるとは思いません。

私の提案は、API に名前空間を使用し、API 名前空間内に Document や HTMLElement などを作成することです。次に例を示します。

var api = {
    Document: { /* your implementation */ },
    HTMLElement: { /* your implementation */ }
    //...
};

var myDocument = new api.Document();

さらに、実際のDocumentプロトタイプを継承して、次のように独自のオブジェクトで使用できます。

api.Document = function(){ /* your implementation */ }
api.Document.prototype = Document.prototype;

var myDocument = new api.Document();

これが助けになることを願っています。私はあなたの質問を理解しました...

于 2013-05-28T11:11:40.300 に答える