Javascript:修改Prototype不会影响现有实例

前端之家收集整理的这篇文章主要介绍了Javascript:修改Prototype不会影响现有实例前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
参见英文答案 > Overwriting and Extending Prototype1个
我创建了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行仍然显示函数定义.

解决方法

基本上,您将重新分配函数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()方法.

猜你在找的JavaScript相关文章