「prototype」の変更
importance: 5
以下のコードでは、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 ); // ?
回答
-
true
.Rabbit.prototype
への割り当ては新しいオブジェクトの[[Prototype]]
を設定しますが、既存のオブジェクトには影響しません。 -
false
.オブジェクトは参照によって割り当てられます。
Rabbit.prototype
のオブジェクトは複製されず、Rabbit.prototype
とrabbit
の[[Prototype]]
の両方によって参照される単一のオブジェクトのままです。したがって、ある参照からコンテンツを変更すると、別の参照から表示できます。
-
true
.すべての
delete
操作はオブジェクトに直接適用されます。ここでは、delete rabbit.eats
はrabbit
からeats
プロパティを削除しようとしますが、それは存在しません。そのため、操作は効果がありません。 -
undefined
.eats
プロパティはプロトタイプから削除され、もう存在しません。