結論から言うと、プロパティは以下の順番で値を探しに行きます。
- ローカルプロパティ
- __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