elementのprototypeについて



0   名前: NullPo : 2006/06/15(木) 23:11  ID:XoE1slt9
document.getElementByID("name");
とかやってエレメントを取得することがあると思いますが、
それらのエレメントには.appendChildとか、メソッドがありますよね。

これらのメソッドをオーバーライドしたり、あるいは増やしたりしたいのですが、
どうしたらいいのでしょう?

Element.prototype.appendChild = function(){}
とかやっても当然のようにダメでした。


1   名前: Pid ◆byEkK9OALr : 2006/06/15(木) 23:11
> Element.prototype.appendChild = function () { }

Gecko なら、Element を constructor として扱えます。また、__defineSetter__ や defineGetter__ と組み合せれば、innerText や currentStyle 等のエミュレーションも可能です。

※もっとも、DOM 勧告において interface として定義されたものが、ECMAScript で constructor として扱えるかどうかは、必ずしも明記されていません。ECMAScript Language Binding には時代ごとにブレがあり、あるプロパティやメソッドが prototype のものなのか、"class" のものなのか、constructor に属するのが微妙で、実際にブラウザごとにも解釈が異なります。ただ、DOM Level 3 Core からは、constructor と object という表現になっていますので、constructor として使って良いのかもしれません。


ただ、

> メソッドをオーバーライドしたり、あるいは増やしたりしたい

気持ちは分かりますが、他スクリプトへの影響が「絶対にない」あるいは「確実に delete して元に戻せる」と言い切れる環境でない限り、ブラウザの組み込みオブジェクトの拡張は、私は賛成しかねます。

「メソッドを拡張したいけどできない」という場合のために、Function#call、Function#apply があるわけですから、まずはこちらをお勧めします。

もしくは、DOM Level 3 Core から、Node#setUserData、Node#getUserData というメソッドが追加されています。各ノードに、UserData としてどんな値でも保存できますので、こちらを上手く活用してみるのも手かと思います。

※なお、IE で標準 DOM を扱えるようにしたり、Gecko、Opera、Safari 等で ECMA 仕様に反する動作を修正する JavaScript ライブラリは、いくつか公開されています。

2   名前: NullPo : 2006/06/15(木) 23:11  ID:1Bb3RL38
>>1
詳しい解説、ありがとうございました。

>Node#setUserData、Node#getUserData
初耳なので勉強してきます。

一覧へ戻る