GeezerVison is showing ja.javascript.info — "prototype" の変更
レッスンに戻る下のコードでは、new Rabbit を作り、そのプロトタイプを変更しようとしています。
最初は次のコードがあります:
function Rabbit() {}
Rabbit.prototype = {
eats: true
};
let rabbit = new Rabbit();
alert( rabbit.eats ); // true
-
1つ文字列を追加しました(強調部分)。今 alert は何が表示されるでしょう?
function Rabbit() {}
Rabbit.prototype = {
eats: true
};
let rabbit = new Rabbit();
Rabbit.prototype = {};
alert( rabbit.eats ); // ?
-
…また、コードが次のような場合は(1行置き換えました)?
function Rabbit() {}
Rabbit.prototype = {
eats: true
};
let rabbit = new Rabbit();
Rabbit.prototype.eats = false;
alert( rabbit.eats ); // ?
-
この場合は (1行置き換えました)?
function Rabbit() {}
Rabbit.prototype = {
eats: true
};
let rabbit = new Rabbit();
delete rabbit.eats;
alert( rabbit.eats ); // ?
-
最後のバリアントです:
function Rabbit() {}
Rabbit.prototype = {
eats: true
};
let rabbit = new Rabbit();
delete Rabbit.prototype.eats;
alert( rabbit.eats ); // ?
Answers:
-
true.
Rabbit.prototype への代入は、新しいオブジェクトに対して [[Prototype]] を設定しますが、既存のものへの影響はありません。
-
false.
オブジェクトは参照によって代入されます。Rabbit.prototype からのオブジェクトは複製されておらず、依然として、Rabbit.prototype と rabbit の [[Prototype]] 両方によって参照される1つのオブジェクトです。
従って、1つの参照を通してその中身を変えたとき、別の参照と通じてそれが見えます。
-
true.
すべての delete 操作はオブジェクトに対して直接適用されます。今回の delete rabbit.eats は rabbit から eats プロパティを削除しようとしますが、rabbit は持ってないのでこの操作は何の影響も与えません。
-
undefined.
プロトタイプから eats プロパティが削除されたので、もう存在していません。