返回課程

變更「原型」

重要性: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 ); // ?
  2. …如果程式碼像這樣(替換了一行)呢?

    function Rabbit() {}
    Rabbit.prototype = {
      eats: true
    };
    
    let rabbit = new Rabbit();
    
    Rabbit.prototype.eats = false;
    
    alert( rabbit.eats ); // ?
  3. 像這樣(替換了一行)呢?

    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. .

    Rabbit.prototype 的賦值會為新物件設定 [[Prototype]],但不會影響現有的物件。

  2. .

    物件是透過參考來賦值的。來自 Rabbit.prototype 的物件並未複製,它仍然是一個單一物件,同時被 Rabbit.prototyperabbit[[Prototype]] 參考。

    因此,當我們透過一個參考變更其內容時,會透過另一個參考看到變更。

  3. .

    所有 delete 動作都會直接套用至物件。這裡的 delete rabbit.eats 嘗試從 rabbit 中移除 eats 屬性,但它不存在。因此,此動作不會有任何效果。

  4. 未定義.

    eats 屬性已從原型中刪除,它不再存在。