0

これは私を非常に混乱させます、そしてここに私の単純なhtmlファイルがあります:

<html>
    <head>
    </head>
    <body>
        <div id="misc">Test</div>
    </body>
</html>

Firebugコンソールの場合:次のスクリプトがあります:

var c = document.documentElement.childNodes[2].childNodes[3];
alert(c.id); //Return misc
alert(c.constructor); // Return [object HTMLDivElement]

私の知る限り、関数のコンストラクターは関数です(これもオブジェクトですが、ここではその関数オブジェクトについては説明していません)。これで、cのコンストラクターはオブジェクトになり、c'コンストラクターコンストラクター(c.constructor.constructor)に問い合わせると、次のような「実際の」関数が返されます。

function Object() {
    [native code]
} 

c.constructorがオブジェクト([object HTMLDivElement])である理由がわかりません。期待どおりの関数である必要があります。これを理解するのを手伝ってくれませんか。ありがとうございました!

4

1 に答える 1

3

短い答えは次のとおりcです。通常のコンストラクターはありません。

より長い答え: DOM 要素、関数オブジェクト、グローバル オブジェクト (通常windowはブラウザー内)、innerHTML 関数などのネイティブ オブジェクトには、通常のコンストラクターがありません。これは、これらが通常 JavaScript ではなく、より低いレベルで (ブラウザーまたはインタープリターが記述された言語で) 実装されているためです。

JavaScript 言語仕様では、これが許可されています。ネイティブの組み込みオブジェクトは、通常の JavaScript オブジェクトである必要はありません。本当の理由は歴史的なものです -- 仕様は基本的に Netscape Navigator をリバース エンジニアリングし、すべての貢献者が書かれた内容に同意することによって書かれました。それ以来、誰もが下位互換性のためにそれに固執しました。最近よく挙げられる実際的な理由はパフォーマンスです。ブラウザがこれを実行できるようになれば、ネイティブ オブジェクトは通常の JavaScript オブジェクトの重い荷物を運ぶ必要がないため、ブラウザはより高速になります。


あなたの特定のケースでは、DOM 要素には通常のコンストラクターがありません。DOM オブジェクトを「構築」する方法は 2 つあります。

  1. document.createElement(). <div>これは、 s、 s などを作成するための公式の DOM メソッドです<span>。ほとんどのブラウザーでは、DOM 要素は通常、プロトタイプから継承されないため、このメソッドは通常のコンストラクターではありません。

  2. innerHTML(). これは、ブラウザの HTML コンパイラにアクセスするためのシン インターフェイスです。これは、ブラウザーが通常の Web ページを解析するために使用するのと同じコンパイラーです。繰り返しますが、これは作成したオブジェクトを返さないため、決して通常のコンストラクタではありません。

constructorDOM 要素には通常のコンストラクターがないため、ブラウザーはプロパティに対して何も返さない可能性があります。あなたのケースで見ているのは、JavaScriptエンジンに漏れた実装の詳細にほとんど残っています。アクセスまたは使用することになっているものではありません。アプリケーションの開発に依存することはほとんどありません。

于 2012-11-08T05:26:06.340 に答える