インスタンスの背後にあるプロトタイプは、を介して作成されたときにrabbit
(から) 割り当てられるため、最初の例では、インスタンスに影響を与えない完全に新しいオブジェクトに置き換えます。2 番目の例では、両方と背後のプロトタイプが指している既存のオブジェクトを変更するだけです。したがって、それらは同じオブジェクトを指しているため、どの参照に従うかに関係なく変更が表示されます。Rabbit.prototype
new Rabbit
Rabbit.prototype
rabbit
Rabbit.prototype
rabbit
順を追って説明しましょうvar rabbit = new Rabbit();
(関係のない詳細は省きます):
新しい空のオブジェクトが作成されます。
その基礎となるプロトタイプ (通常は と呼ばれる[[Proto]]
) は に設定されRabbit.prototype
ます。(私が「通常呼ばれる」と言うのは、それが仕様で呼ばれているためです。その名前で直接アクセスすることはできません。ただし、ES5 対応環境では、Object.getPrototypeOf
.エンジンはまた、実際には [in code] と呼ばれる非標準のプロパティを介して利用できるようにします__proto__
。)
その新しいオブジェクトが返され、 に割り当てられrabbit
ます。
これで、プロトタイプ オブジェクトを指す 2 つのオブジェクトRabbit.prototype
、 、および ができrabbit.[[Proto]]
ました。
最初の例ではRabbit.prototype
、まったく新しい別のオブジェクトを指すように変更します。そのため、同じオブジェクトを指すことはなくなりましたRabbit.prototype
。rabbit.[[Proto]]
2 番目の例では、その共有オブジェクトのeats
プロパティの値を変更するだけなので、その変更は、従うオブジェクトへの参照に関係なく表示されます。
基本的にはこれと同じです:
var a = {eats: true};
var b = a;
a = {eats: false};
console.log(a.eats); // false
console.log(b.eats); // true
と
var a = {eats: true};
var b = a;
a.eats = false;
console.log(a.eats); // false
console.log(b.eats); // false