为什么更改原型不会影响以前创建的对象?

时间:2012-08-22 19:53:09

标签: javascript prototype

我有以下代码:

var A = function() {};
var a = new A();
var b = new A();
A.prototype.member1 = 10;

A.prototype = {}
var c = new A();
console.log(a.member1);
console.log(a.constructor === b.constructor);
console.log(a.constructor === c.constructor);
console.log('---------');
console.log(c.member1);

它的输出是:

10
true
false
---------
undefined
undefined

ab的原型没有改变,c有了新原型。我是对的,这是因为a.constructor不等于c.constructor并且每个人都拥有prototype这个事实?当两个物体的构造者可能不相等时,还有其他的东西吗?

额外的问题:为什么印有两个undefined字符串? (铬)

3 个答案:

答案 0 :(得分:5)

当你打电话时

var a = new A();

基本上完成了这项任务:

a.__proto__ = A.prototype;

然后,您将A.prototype重新分配给新对象,因此c获取{}作为其原型。

A.prototype = {};
var c = new A();

但是,这不会破坏旧的A.prototype对象 - a.__proto__仍然指向它。

  

我是对的,这是因为a.constructor不等于c.constructor并且每个都有自己的原型吗?

.constructor基本上只是一个便利的属性。它对实例的行为没有影响。

  

额外的问题:为什么印有两个未定义的字符串?

不在我的控制台中,他们没有! (歌剧12)

答案 1 :(得分:2)

创建对象时,构造函数的原型将分配给新对象的__proto__属性。您之后正在更改原型,但两个ab对象已经指向原始参考:

var a = new A();
// a.__proto__ == A.prototype == {} (soon == {member1:10})
var b = new A();
// b.__proto__ == A.prototype == {} (soon == {member1:10})

A.prototype = {} // this changes A.prototype, but not a.__proto__ or b.__proto__
var c = new A(); // c.__proto__ = {}

您的第一个undefined来自c.member1。第二个是chrome,说你的整个陈述没有返回值

答案 2 :(得分:2)

答案在于代码的这一行:

A.prototype = {}

当你到达这行代码时,你实际上在内存中创建了一个全新的OBJECT对象{}。使用A作为构造函数创建任何新对象将指向此BRAND NEW OBJECT作为原型。

但是,OLD PROTOTYPE仍然存在于内存中。这只是A.prototype不再指向它。在重新定义A的原型引用之前使用A作为构造函数创建的任何对象仍指向此OLD PROTOTYPE,因为它是原型。