「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プロパティはプロトタイプから削除され、もう存在しません。