"prototype" の変更
重要性: 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 ); // ?
Answers:
-
true.Rabbit.prototypeへの代入は、新しいオブジェクトに対して[[Prototype]]を設定しますが、既存のものへの影響はありません。 -
false.オブジェクトは参照によって代入されます。
Rabbit.prototypeからのオブジェクトは複製されておらず、依然として、Rabbit.prototypeとrabbitの[[Prototype]]両方によって参照される1つのオブジェクトです。従って、1つの参照を通してその中身を変えたとき、別の参照と通じてそれが見えます。
-
true.すべての
delete操作はオブジェクトに対して直接適用されます。今回のdelete rabbit.eatsはrabbitからeatsプロパティを削除しようとしますが、rabbitは持ってないのでこの操作は何の影響も与えません。 -
undefined.プロトタイプから
eatsプロパティが削除されたので、もう存在していません。