レッスンに戻る

「prototype」の変更

importance: 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 ); // ?

回答

  1. true.

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

  2. false.

    オブジェクトは参照によって割り当てられます。 Rabbit.prototypeのオブジェクトは複製されず、 Rabbit.prototyperabbit[[Prototype]]の両方によって参照される単一のオブジェクトのままです。

    したがって、ある参照からコンテンツを変更すると、別の参照から表示できます。

  3. true.

    すべてのdelete操作はオブジェクトに直接適用されます。ここでは、delete rabbit.eatsrabbitからeatsプロパティを削除しようとしますが、それは存在しません。そのため、操作は効果がありません。

  4. undefined.

    eatsプロパティはプロトタイプから削除され、もう存在しません。