3

私は今prototype.jsを学んでいます。何かがおかしいようです。たとえば、以下は firebug で実行したコード フラグメントです。URL はhttp://api.prototypejs.org/dom/Element/です。これは、ページにprototype.js があるためです。

var el2 = document.createElement('div');
var k=0;
for(var i in el2){ k++};
console.log(k);

結果は 262 で、非常に奇妙です。なぜなら、prototype.js のないページで同じコードを実行すると、結果は 195 になるからです。私の質問は、prototype.js が document.createElement メソッドにどのように影響するかです。プロトタイプ.js で document.createElement をクエリすると、document.createElement=function(){} のようなコードが見つかりません。

ありがとう!

4

4 に答える 4

1

投稿したコードによると、要素オブジェクトをループして、その要素オブジェクトのプロパティの数を数えています。

他の投稿者が指摘しているように、PrototypeJS は追加のメソッドとプロパティを HTMLElement のネイティブ Javascript 定義に追加します。

Element 名前空間http://api.prototypejs.org/dom/Element/を見てください。PrototypeJS が追加するすべてのメソッドとプロパティがリストされています。

詳細情報を編集

PrototypeJS はどのようにして新しいメソッドを要素に追加しますか?

最初に、javascript プロトタイプがどのように機能するかを理解する必要があります。最も簡単な定義は、オブジェクトを構築するための設計図であり、そのタイプの新しいオブジェクトが作成されると、そのオブジェクトにはその設計図で定義されたすべてのメソッドとそれ以降のメソッドが含まれます。プロトタイプチェーン。

プロトタイプ チェーンの最も簡単な例

 DIVElement -> HTMLElement -> Object

したがって、新しい div 要素は、DIVElement プロトタイプ、HTMLElement プロトタイプ、および Object プロトタイプのすべてのメソッドを取得します。

これは、すべてがそのプロトタイプからコピーされるため、Object プロトタイプを拡張することをお勧めできない理由でもあります。

そのため、PrototypeJS は、HTMLElement.prototypeほとんどのブラウザーにネイティブに存在しない新しいメソッドでオブジェクトを拡張し、JavaScript で新しい HTML 要素が作成されるたびに、PrototypeJS メソッドのコピーを取得します。

ソースコードの特定の場所

Object.extend(GLOBAL.Element, {
  extend:     extend,
  addMethods: addMethods
});

これは、ブラウザーがサポートする要素などを確認するための多くの機能検出の最後にあります。

于 2013-06-25T21:08:43.213 に答える
0

どうもありがとう。protytype.js がネイティブ拡張を行う方法を知っていると思います。

(function(div) {

if (!Prototype.BrowserFeatures.ElementExtensions && div['__proto__']) {
    window.HTMLElement = { };
    window.HTMLElement.prototype = div['__proto__'];
    Prototype.BrowserFeatures.ElementExtensions = true;
}

div = null;})(document.createElement('div'));

これはネイティブ拡張を行うコードの断片だと思います。

于 2013-06-26T08:51:10.080 に答える