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
初耳なので勉強してきます。