【发布时间】:2017-10-01 13:52:13
【问题描述】:
我创建了 2 个原型实例,更改了原型中的一个函数,更改反映在两个实例中(很棒)。 但是,当我通过删除函数修改原型时,该函数对于现有实例仍然存在。
function A() {
this.name = "cool";
}
A.prototype = {
howCool: function() {
return this.name + "er";
}
};
var a1 = new A(),
a2 = new A();
a1.name = "hot";
//line1
console.log(a1.howCool());
//line2
console.log(a2.howCool());
A.prototype = {};
//line3
console.log(a1.howCool());
//line4
var a3 = new A();
console.log(a3.howCool());
第 1 行和第 2 行按预期工作,将原型设置回空后,第 4 行显示未定义,这是预期的。 然而,第 3 行仍然显示函数定义。
【问题讨论】:
-
您不是在修改原型对象,而是在创建一个新对象。
-
您实际上将原型属性重新分配给了一个新对象。旧的仍然存在。
-
FWIW,它不能以这种方式工作的原因与为什么在
var a = 42; var b = a; a = 21;之后,b仍然具有值42:JavaScript as copy/assign by value 语义相同。b具有a值的副本,而不是对变量a本身的引用。与prototype类似,新实例获得A.prototype的值 的副本(这是对object 的引用),而不是对 的引用属性A.prototype本身。
标签: javascript ecmascript-6 prototype