参见英文答案 >
Overwriting and Extending Prototype1个
我创建了2个原型实例,在原型中更改了一个函数,在两个实例中都反映了变化(很棒).
但是,当我通过删除函数修改原型时,该函数仍然存在于现有实例中.
我创建了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());
解决方法
基本上,您将重新分配函数A的prototype属性以指向新对象.这不会影响旧对象,因此不会影响先前的实例.
以下是正在发生的事情的说明.
执行此代码后:
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();
A.prototype指向一个新对象,但旧实例的[[Prototype]]属性仍指向旧对象.
如果要实际删除该方法,则必须编辑原始对象,而不是指向新对象.
要从原型中实际删除howCool()方法,这样的东西可以工作:
delete A.prototype.howCool
哪个会给:
现在任何未来的实例,例如a3和先前的实例,都将指向同一个对象,但该对象将不具有howCool()方法.