2017-03-04 61 views
-1

我在JavaScript運行此,我想設置增量值:JavaScript變量數組對象沒有設置

var parts = {}; 
var parts_default = {success: function(){}, dane: "cos tam"}; 
for (var i = 1; i <= 3; i++) { 
    parts[i] = parts_default ; 
    parts[i].varX = i ; 
} 
console.log(parts); 

我得到的結果:

{ 
"1": { 
    "dane": "cos tam", 
    "varX": 3 
    }, 
    "2": { 
    "dane": "cos tam", 
    "varX": 3 
    }, 
    "3": { 
    "dane": "cos tam", 
    "varX": 3 
    } 
} 

變量VARx前提具有相同的值3,但我預計如下:

{ 
"1": { 
    "dane": "cos tam", 
    "varX": 1 
    }, 
    "2": { 
    "dane": "cos tam", 
    "varX": 2 
    }, 
    "3": { 
    "dane": "cos tam", 
    "varX": 3 
    } 
} 

這是怎麼回事?

+0

'parts [i] = parts_default',您將所有屬性設置爲相同的對象。這意味着'parts [1] === parts [2] && parts [2] === parts [3]',所以當你使用'parts [i] .varX'時修改同一個對象。 –

+0

Objects is passed by引用,因此每個只是指向內存中同一對象的指針。 – Sam

回答

0

你的相同對象parts每次加在循環中,因爲當你這樣做:

parts[i] = parts_default; 

那份對象引用,不是對象。然後當你做

parts[i].varX = i; 

你正在更新這個單一的對象。

您可以用新的Object.assign功能,可polyfilled老年人JavaScript引擎的對象複製:

var parts = {}; 
 
var parts_default = {success: function(){}, dane: "cos tam"}; 
 
for (var i = 1; i <= 3; i++) { 
 
    parts[i] = Object.assign({}, parts_default); 
 
    parts[i].varX = i ; 
 
} 
 
console.log(parts);

注意,所有對象將共享相同的success功能。

+0

我在第一種方法中做了同樣的事情,但爲什麼輸出會顯示最後2個對象的'** ref:3 **'。這應該不是每次都創建不同的對象? – Rajesh

+1

@Rajesh:確實如此。但它是一個淺拷貝。正如我上面所說的,所有副本都共享相同的「成功」功能。 (這可能很好。)這就是'ref:'的意義所在。 –

0

您可以使用Object.create來創建新對象。

Object.create()方法用指定的原型對象和屬性創建一個新對象。

var parts = {}; 
 
var parts_default = { success: function() {}, dane: "cos tam" }; 
 
for (var i = 1; i <= 3; i++) { 
 
    parts[i] = Object.create(parts_default); 
 
    parts[i].varX = i; 
 
} 
 

 
console.log(parts);