返回课程

更改“原型”

重要性: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 属性从原型中删除,它不再存在。