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