如果修改构造函数的原型对象,现有构造函数是否不受影响?

Does existing constructor remain unaffected if you modify the prototype object for a constructor function?

本文关键字:构造函数 是否 不受影响 对象 修改 原型 如果      更新时间:2023-09-26

如果你修改了一个构造函数的原型对象,这些更改只对你使用该构造函数创建的新对象可见;使用构造函数创建的现有对象将不受影响。对还是错?

很容易测试:

//
//our constructor
function myThing(){
}
//create a prototype method
myThing.prototype.foo = function(){
  return 'bar'; 
};
//create a prototype property
myThing.prototype.thing = 'hello';
var bar = new myThing();
console.log(bar.foo());//bar
console.log(bar.thing);//hello


//modify prototype
myThing.prototype.foo = function(){
  return 'baz'; 
};
myThing.prototype.thing = 'goodbye';
//create new
var bar2 = new myThing();

//log old
console.log(bar.foo()); //baz
console.log(bar.thing); //goodbye
//log new
console.log(bar2.foo()); //baz 
console.log(bar2.thing); //goodbye
//

所以你可以看到你的语句是false在这种情况下:如果你的对象正在使用原型方法和属性,并且这些方法或属性被修改(同时保持相同的原型引用,参见Oriol的答案的差异),现有的对象将受到影响。

True。这个魔术是通过内部的[[Prototype]]属性完成的,该属性决定了对象从哪个对象继承。

当你实例化一个构造函数时,实例的[[Prototype]]被设置为当前的prototype

之后更改prototype不会影响之前的实例,它们的[[Prototype]]仍然指向之前的prototype

更改将只影响更改后创建的实例,它们的[[Prototype]]将被设置为新的prototype

function F(){}
var f1 = new F();
f1 instanceof F; // true
F.prototype = {foo: 'bar'}
var f2 = new F();
f1.foo; // undefined
f2.foo; // "bar
f1 instanceof F; // false
f2 instanceof F; // true

我不太明白你的意思。

表示现有实例不受影响
  • true当你将构造函数的.prototype属性设置为不同的原型对象时。
  • false当你通过在原型对象上设置属性来修改它时。