0
function DivElement(){
    this.ctor.apply(this,arguments);
}

DivElement.prototype = {
    obj:{
        name:'',
        src:''
    },
    objName:'',
    objSrc:'',

    ctor:function(){
        this.obj.name = arguments[0];
        this.obj.src = arguments[1];
        this.objName = arguments[0];
        this.objSrc = arguments[1];
    }
}

var d1 = new DivElement('a','a.jpg');
var d2 = new DivElement('b','b.jpg');

console.log(d1.obj.src);    //b.jpg
console.log(d2.obj.src);    //b.jpg
console.log(d1.objSrc);     //a.jpg
console.log(d2.objSrc);     //b.jpg

问题是为什么 d1.obj.src 不是'a.jpg'?

如果我像这样重写函数ctor:

ctor:function(){
    this.obj = {name:arguments[0],src:arguments[1]};
    this.objName = arguments[0];
    this.objSrc = arguments[1];
}

它工作正常!

谁能告诉我那边发生了什么...

4

2 回答 2

1

您遇到的问题是实例DivElement共享相同的对象obj,除非您没有明确地将它分配为您的实例的属性。

所以实际发生的是在这条线上this.obj.src = arguments[1];

您正在覆盖被所有实例遮蔽src的对象的属性。obj

因此,一旦您ctor第二次执行,youz 就会用初始化的值覆盖' s的d1属性。srcad2

this.objSrc = arguments[1];是它自己的实例的 Own 属性,因此每个实例都有自己的副本,并且不会在第二次执行中被覆盖。

这同样适用于this.obj = {name:arguments[0],src:arguments[1]};您将对象obj显式分配给每个实例。

于 2013-01-21T08:40:08.417 回答
0

原型中的项目不会为每个新对象进行深度复制。因此,当您尝试obj.name从原型中使用时,所有对象都只有一个副本obj。因此,您的第二个对象是从第一个对象覆盖的obj,因此会产生混淆。原型最适用于函数或常量,而不适用于对象和数组。

最好obj在构造函数中添加到您的实例数据,这样每个实例都会有一个新的,如下所示:

function DivElement(){
    this.ctor.apply(this,arguments);
}

DivElement.prototype = {
    ctor:function(){
        this.obj = {};
        this.obj.name = arguments[0];
        this.obj.src = arguments[1];
        this.objName = arguments[0];
        this.objSrc = arguments[1];
    }
}

var d1 = new DivElement('a','a.jpg');
var d2 = new DivElement('b','b.jpg');

console.log(d1.obj.src);    //b.jpg
console.log(d2.obj.src);    //b.jpg
console.log(d1.objSrc);     //a.jpg
console.log(d2.objSrc);     //b.jpg
于 2013-01-21T08:33:56.760 回答