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、2回目の実行を実行するとすぐに、youzは、で初期化された値でd1'プロパティを上書きします。srcad2

this.objSrc = arguments[1];はインスタンス自体の独自のプロパティであるため、各インスタンスには独自のコピーがあり、2回目の実行で上書きされることはありません。

this.obj = {name:arguments[0],src:arguments[1]};オブジェクトobjをすべてのインスタンスに明示的に割り当てる場合も同じです。

于 2013-01-21T08:40:08.417 に答える
0

プロトタイプのアイテムは、新しいオブジェクトごとにディープ コピーされません。したがって、プロトタイプから使用しようとすると、すべてのオブジェクトに対して のobj.nameコピーが 1 つしかありません。objしたがって、2 番目のオブジェクトが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 に答える