"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
プロパティが削除されたので、もう存在していません。