レッスンに戻る

"prototype" の変更

重要性: 5

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

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

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

let rabbit = new Rabbit();

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

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

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

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

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

Answers:

  1. true.

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

  2. false.

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

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

  3. true.

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

  4. undefined.

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