我创建了原型的 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 行仍然显示函数定义。
本质上你正在重新分配prototype
函数的属性A
指向一个新对象。这不会影响旧对象,因此不会影响之前的实例。
这是正在发生的情况的说明。
这段代码执行后:
function A() {
this.name = "cool";
}
A.prototype = {
howCool: function() {
return this.name + "er";
}
};
var a1 = new A(),
a2 = new A();
情况如下:
那么这段代码执行后:
A.prototype = {};
var a3 = new A();
The A.prototype
指向一个新对象,但是[[原型]] https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/proto旧实例的属性仍然指向旧对象。
如果您想实际删除该方法,则必须编辑原始对象,而不是指向新对象。
实际删除howCool()
原型中的方法,类似这样的方法可以工作:
delete A.prototype.howCool
这会给出:
现在任何未来的实例,例如a3
,以及之前的,仍然会指向同一个对象,但该对象不会有howCool()
方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)