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

Sid*_*uru 7 javascript prototype ecmascript-6

我创建了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());
Run Code Online (Sandbox Code Playgroud)

第1行和第2行按预期工作,在将原型设置为空后,第4行显示未定义的预期值.但是第3行仍然显示了函数定义.

nem*_*035 5

基本上,您prototype将为函数重新分配属性A以指向新对象.这不会影响旧对象,因此不会影响先前的实例.

这是一个正在发生的事情的例证.

执行此代码后:

function A() {
  this.name = "cool";
}

A.prototype = {
  howCool: function() {
    return this.name + "er";
  }
};

var a1 = new A(),
  a2 = new A();
Run Code Online (Sandbox Code Playgroud)

情况如下:

之前

然后执行此代码:

A.prototype = {};

var a3 = new A();
Run Code Online (Sandbox Code Playgroud)

A.prototype指向新对象的点但旧实例的[[Prototype]]属性仍指向旧对象.

后

如果要实际删除该方法,则必须编辑原始对象,而不是指向新对象.

要从howCool()原型中实际删除方法,这样的东西可以工作:

delete A.prototype.howCool
Run Code Online (Sandbox Code Playgroud)

哪个会给:

最后

现在任何未来的实例,例如a3和先前的实例,都将指向同一个对象,但该对象将不具有该howCool()方法.