プロパティの参照順序について
結論から言うと、プロパティは以下の順番で値を探しに行きます。
- ローカルプロパティ
- __proto__内のプロパティ(prototypeからセットされたプロパティ)
- __proto__.__proto__内のプロパティ
- __proto__.__proto__.__proto__・・・と続く
- undefined
以下の例で言うと、naotoknkオブジェクトのプロパティは以下の順番で値を探しに行きます。
- naotoknk(WorkerBee内で定義されたプロパティ)
- naotoknk.__proto__(WorkerBee.prototype内で定義されたプロパティ)
- naotoknk.__proto__.__proto__(Employee.prototype内で定義されたプロパティ)
- naotoknk.__proto__.__proto__.__proto__(Object.prototype内で定義されたプロパティ)
- undefined
function Employee() { this.name = ""; this.dept = "general"; } function WorkerBee() { this.projects = []; } WorkerBee.prototype = new Employee; // 継承 var naotoknk = new WorkerBee;
この例では、WorkerBee.prototypeにEmployeeのインスタンスを定義しています。Employeeインスタンスにはnameプロパティとdeptプロパティが定義されているので、WorkerBee.prototype内にnameプロパティとdeptプロパティが定義されるのです(すなわち、継承)。
このとき、naotoknk.nameを参照すると、naotoknk内にnameプロパティを探しに行きます。しかし、存在しないため、naotoknk.__proto__内に探しに行きます。ここには存在するため、""(空文字列)を返します。
naotoknk.name == naotoknk.__proto__.name