2013-08-18 46 views
-1

對不起,我不知道如何解釋,但情況就像這個例子。js更改變量會影響到原始變量

我瞬間new function c後,並更改值this.i將直接影響到a.

我該如何解決這個問題?我不知道this.i會影響到a

http://jsbin.com/iPIkomu/1/edit

var a = { c: 1 }; 

var b = function(){ 
    this.i = a; 

    this.i.c = 2; 
}; 


var c = function(){ 
    this.i = a; 

    alert(this.i.c); 

}; 

c.prototype.set = function(){ 
    this.i.c = 4; 

    alert(a.c); 
}; 

d =new c(); 

d.set(); 
+2

如果你不想被共享的對象,那麼你爲什麼做參考到你的構造函數創建的每個對象上的同一個對象?對於'var a = {...}'還有其他目的嗎?是否有一個理由需要在構造函數之外?我不知道如何解決這個問題,因爲我不知道你最終想做什麼。 –

+0

這是因爲一個可能是一個默認的變量用於許多構造函數......有意義嗎? – Till

+1

如果要由幾個構造函數使用,並且您不想重複代碼,則可以使用下面答案中所示的函數創建它,也可以使用共享對象作爲主對象的原型,然後使用'Object.create()'設置繼承。所以你會'this.i = Object.create(a);' –

回答

2

我會建議改變:

var a = { c: 1 }; 
to 
var a = function() { return { c: 1 }; } 

再後來

this.i = a; 
to 
this.i = a(); 

做一樣,你一定會認爲你總是得到一個新的對象的事情。使用你的代碼,你指的是同一個對象。

+0

非常感謝你,這是理想的 – Till

+0

我很高興我的幫助;) – Krasimir

+0

測試,它會有相同的結果.... ...... – Till

4

對象總是通過引用周圍通過。 athis.i指的是完全相同的對象。

要獲取不同的對象,您只需要執行this.i = {c:1};或類似操作。

0

使用此

let person1 = { name: 'Vitor', birthYear: 1995 }; 
// ES6 method 
let person2 = Object.assign({}, person1); 

在ArrayObject的

let person1 = [{ name: 'Vitor', birthYear: 1995 }, 
       { name: 'Mark', birthYear: 1998 }]; 
// ES6 method 
let person2 = Object.assign([], person1); 

參考,的情況下: https://hackernoon.com/javascript-reference-and-copy-variables-b0103074fdf0