修改 "prototype"
重要程度: 5
在下面的代码中,我们创建了 new Rabbit,然后尝试修改它的 prototype。
最初,我们有以下代码:
function Rabbit() {}
Rabbit.prototype = {
eats: true
};
let rabbit = new Rabbit();
alert( rabbit.eats ); // true
-
我们增加了一行代码(已高亮)。现在
alert会显示什么?function Rabbit() {} Rabbit.prototype = { eats: true }; let rabbit = new Rabbit(); Rabbit.prototype = {}; alert( rabbit.eats ); // ? -
……如果代码是这样的(修改了一行)?
function Rabbit() {} Rabbit.prototype = { eats: true }; let rabbit = new Rabbit(); Rabbit.prototype.eats = false; alert( rabbit.eats ); // ? -
像这样呢(修改了一行)?
function Rabbit() {} Rabbit.prototype = { eats: true }; let rabbit = new Rabbit(); delete rabbit.eats; alert( rabbit.eats ); // ? -
最后一种变体:
function Rabbit() {} Rabbit.prototype = { eats: true }; let rabbit = new Rabbit(); delete Rabbit.prototype.eats; alert( rabbit.eats ); // ?
答案:
-
true。Rabbit.prototype的赋值操作为新对象设置了[[Prototype]],但它不影响已有的对象。 -
false。对象通过引用被赋值。来自
Rabbit.prototype的对象并没有被赋值,它仍然是被Rabbit.prototype和rabbit的[[Prototype]]引用的单个对象。所以当我们通过一个引用更改其内容时,它对其他引用也是可见的。
-
true。所有
delete操作都直接应用于对象。这里的delete rabbit.eats试图从rabbit中删除eats属性,但rabbit对象并没有eats属性。所以这个操作不会有任何影响。 -
undefined。属性
eats被从 prototype 中删除,prototype 中就没有这个属性了。