レッスンに戻る

下のコードでは、new Rabbit を作り、そのプロトタイプを変更しようとしています。

最初は次のコードがあります:

function Rabbit() {}
Rabbit. = {
  eats: true
};

let rabbit = new Rabbit();

alert( rabbit.eats ); // true
  1. 1つ文字列を追加しました(強調部分)。今 alert は何が表示されるでしょう?

    function Rabbit() {}
    Rabbit. = {
      eats: true
    };
    
    let rabbit = new Rabbit();
    
    Rabbit. = {};
    
    alert( rabbit.eats ); // ?
  2. …また、コードが次のような場合は(1行置き換えました)?

    function Rabbit() {}
    Rabbit. = {
      eats: true
    };
    
    let rabbit = new Rabbit();
    
    Rabbit..eats = false;
    
    alert( rabbit.eats ); // ?
  3. この場合は (1行置き換えました)?

    function Rabbit() {}
    Rabbit. = {
      eats: true
    };
    
    let rabbit = new Rabbit();
    
    delete rabbit.eats;
    
    alert( rabbit.eats ); // ?
  4. 最後のバリアントです:

    function Rabbit() {}
    Rabbit. = {
      eats: true
    };
    
    let rabbit = new Rabbit();
    
    delete Rabbit..eats;
    
    alert( rabbit.eats ); // ?

Answers:

  1. true.

    Rabbit. への代入は、新しいオブジェクトに対して [[]] を設定しますが、既存のものへの影響はありません。

  2. false.

    オブジェクトは参照によって代入されます。Rabbit. からのオブジェクトは複製されておらず、依然として、Rabbit.rabbit[[]] 両方によって参照される1つのオブジェクトです。

    従って、1つの参照を通してその中身を変えたとき、別の参照と通じてそれが見えます。

  3. true.

    すべての delete 操作はオブジェクトに対して直接適用されます。今回の delete rabbit.eatsrabbit から eats プロパティを削除しようとしますが、rabbit は持ってないのでこの操作は何の影響も与えません。

  4. undefined.

    プロトタイプから eats プロパティが削除されたので、もう存在していません。