- ベストアンサー
DOMと同名のユーザ定義メソッドを作成できる?
下記リンク先で、ユーザ定義のcreateElement関数を作成していますが、 既にDOMで(?)、document.createElementという同名メソッドがあるのに、 どうしてエラーにならないのでしょうか? ・documentオブジェクトに紐づいているものとそうではないものの違い? ・ユーザ定義関数は、documentオブジェクトに紐付けることはできないのでしょうか? ▽createElementメソッドが微妙なので汎用的な関数にする http://taiju.hatenablog.com/entry/20100225/1267106069
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
『documentオブジェクトに紐づいているものとそうではないものの違い?』 はい、その通りです。 リンク先のユーザ定義の createElement は、定義文の書かれたスコープ内に変数のように存在しています。 これは document オブジェクトの持つメソッドとは異なるため、とくに干渉し合いません。 『ユーザ定義関数は、documentオブジェクトに紐付けることはできないのでしょうか?』 いいえ、ある程度は可能です。 たとえば document.createElement は置き換えることができます: eg) document.createElement = function() {return 0}; 一方で、document.body などは置き換えられません。 プロパティ・メソッドの書き換えの可否はオブジェクト毎に決まっています。 *) 正確には、置き換えより重ね書きのイメージに近いものです。 document.createElement の実体は Document.prototype が持っています: document.hasOwnProperty('createElement'); // -> false Document.prototype.hasOwnProperty('createElement'); // -> true 普通は document.createElement() によって Document.prototype.createElement が呼ばれますが、document.createElement = ... と独自に定義するとそちらが呼ばれるようになります。 オブジェクトに直接メソッドが定義されている場合はそれを、オブジェクトが直接メソッドを持つわけではない場合はプロトタイプの中から該当のメソッドを呼び出す、という動作になっています。
お礼
回答ありがとうございました。 >正確には、置き換えより重ね書きのイメージに近いものです ・参考になりましたー