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

时间:2015-08-11 16:46:05

标签: javascript prototype

如果修改构造函数的原型对象,则更改仅对使用该构造函数创建的新对象可见;使用构造函数创建的现有对象不受影响。对错吗?

3 个答案:

答案 0 :(得分:1)

测试相当容易:

//
//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的回答差异),现有的对象会受到影响。

答案 1 :(得分:0)

真。魔术是通过内部[[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

答案 2 :(得分:0)

我不确定你的意思。现有实例将不受影响

    将构造函数的.prototype属性设置为其他原型对象时,
  • true
  • 通过在其上设置属性来修改原型对象时,
  • false