如果修改构造函数的原型对象,现有构造函数是否不受影响?
Does existing constructor remain unaffected if you modify the prototype object for a constructor function?
如果你修改了一个构造函数的原型对象,这些更改只对你使用该构造函数创建的新对象可见;使用构造函数创建的现有对象将不受影响。对还是错?
很容易测试:
//
//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当你通过在原型对象上设置属性来修改它时。
相关文章:
- ES6类是否与构造函数相同
- 如何检查DOM节点是否继承自构造函数
- 是否可以测试javascript函数是否是构造函数
- 正在检测是否在构造函数内部使用了新关键字
- 是否可以在函数构造函数中识别哪个对象调用它,并在错误的对象调用时中止创建
- 在定义了构造函数之后,是否可以将实例属性添加到JavaScript原型中
- 构造函数的“实例”是否有严格的定义
- 是否需要初始化在 Javascript 中作为“类”构造函数参数传递的变量
- 是否存在替换Javascript构造函数的问题'原型,而不是添加到原型中
- MongoDB 的集合构造函数是否仅在集合不存在时才创建集合
- 在 JavaScript ES2015 中,在扩展类时,我们是否需要显式创建一个新的构造函数,或者我们是否可以只使用父类
- jQuery构造函数中的函数是否执行任何不同操作
- 高级Javascript:检测当前函数是否由构造函数调用
- 是否可以在 TypeScript 中使用构造函数作为另一个函数的参数类型
- 是否可以在没有构造函数参数的情况下实例化空对象/对象
- 函数是否无法返回构造函数并创建新实例
- backbone.js构造函数是否可以返回子类
- 检查类构造函数是否继承了另一个类
- 如果修改构造函数的原型对象,现有构造函数是否不受影响?
- 如何验证构造函数是否是使用 sinon 调用的