6

我有以下代码:

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字符串?(铬)

4

3 回答 3

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)

于 2012-08-22T20:05:54.613 回答
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 说你的整个语句没有返回值

于 2012-08-22T20:06:33.677 回答
2

答案就在这行代码中:

A.prototype = {}

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

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

于 2012-08-22T20:07:52.387 回答