JavaScriptにおいて、メソッドとは、関数であるプロパティでのことです。メソッド呼び出し(obj.method(args, ...)
という書き方)は、オブジェクトからその名前のプロパティを探し出し、そのプロパティの値を関数として呼び出す事になります。では、この「オブジェクトからその名前のプロパティを探し出す」というのは、どういう動作をするのかです。
オブジェクトからその名前のプロパティを探し出すことは、次のような動作になります。
- 最初にオブジェクトが直接持っているプロパティからの名前のものがあるか探します。もし、見つかれば、そのプロパティの値を返し、処理が終了します。
- 見つからなければ、オブジェクトのプロトタイプ(
[[Prototype]]
)であるオブジェクトへ探索対象が移り、プロトタイプであるオブジェクトが直接持っているプロパティからの名前のものがあるか探します。もし、見つかれば、そのプロパティの値を返し、処理が終了します。
- それでも見つからなければ、先程のプロトタイプであるオブジェクトのプロトタイプであるオブジェクトへ探索対象が移り、同じようにプロパティを探します。以下、プロトタイプが
null
になるまで、繰り返します。
- 見つからずに、プロトタイプが
null
になってしまった場合、undefined
を返し、処理が終了します。
この動作をプロトタイプチェーンと言います。オブジェクトのプロトタイプ([[Prototype]]
)はObject.getPrototypeOf()
で取得でき、一般的に、コンストラクタ関数のprototype
プロパティのオブジェクトです。そして、コンストラクタ関数のprototype
プロパティのオブジェクトのプロトタイプはは親のコンストラクタ関数のpurototype
プロパティになっています。最終的に、Object.prototype
に遡り、Object.getPrototypeOf(Object.prototype)
はnull
になっていまうす。
さて、div要素を表示したのにメソッドが見つからなかったと言うことですが、div要素自体はメソッドを直接持っていなくても、プロトタイプチェーンを辿っていけば、そのメソッドを呼び出せることになります。実際に、divのプロトタイプを辿ると次のようになっています。
div -> HTMLDivElement.prototype
-> HTMLElement.prototype
-> Element.prototype
-> Node.prototype
-> EventTarget.prototype
-> Object.prototype
-> null
※コンソールでの表示ではprototypeが省略されている場合があります。
※Chromeですと、console.dir
で表示させて、[[Prototype]]というところ展開することで辿れます。ただ、最後のOjbectはちょっと特殊みたいです。
Node.prototype
がappendChild
メソッドを持っています。el.appendChild()
と書いた場合、Node.prototype.appendChild
メソッドが(this
をel
として)呼び出されることになります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/16 10:53