我有以下代码:
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
a
和b
的原型没有改变,c
有了新原型。我是对的,这是因为a.constructor
不等于c.constructor
并且每个人都拥有prototype
这个事实?当两个物体的构造者可能不相等时,还有其他的东西吗?
额外的问题:为什么印有两个undefined
字符串? (铬)
答案 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__
属性。您之后正在更改原型,但两个a
和b
对象已经指向原始参考:
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,因为它是原型。