更改“原型”
重要性:5
在下面的代码中,我们创建了 new Rabbit
,然后尝试修改它的原型。
在开始时,我们有这段代码
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 ); // ?
答案
-
正确
.对
Rabbit.prototype
的赋值设置了新对象的[[Prototype]]
,但它不会影响现有的对象。 -
错误
.对象是通过引用分配的。来自
Rabbit.prototype
的对象没有被复制,它仍然是一个单一对象,被Rabbit.prototype
和rabbit
的[[Prototype]]
引用。因此,当我们通过一个引用更改其内容时,它可以通过另一个引用看到。
-
正确
.所有
delete
操作都直接应用于对象。这里delete rabbit.eats
试图从rabbit
中删除eats
属性,但它没有这个属性。因此,操作不会有任何影响。 -
未定义
.eats
属性从原型中删除,它不再存在。