回到课程
本资料仅提供以下语言版本:English, 日本語。请 帮助我们 将其翻译为 简体中文 版本。

Changing "prototype"

重要程度: 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 ); // ?

Answers:

  1. true

    赋值操作 Rabbit.prototype 为新对象设置了 [[Prototype]],但它不影响现有的对象。

  2. false

    对象通过引用进行赋值。来自 Rabbit.prototype 的对象没有被复制,它仍然是由 Rabbit.prototyperabbit[[Prototype]] 引用的单个对象。

    所以当我们通过一个引用来改变它的上下文时,它对其他引用来说是可见的。

  3. true

    所有 delete 操作都直接应用于对象。这里 delete rabbit.eats 试图从 rabbit 中删除 eats 属性,但 rabbit 对象并没有 eats 属性。所以这个操作不会有任何 副作用。

  4. undefined

    属性 eats 从原型中删除,它不再存在。