2015-10-07 50 views
2

如何引用一個對象而不是複製它?如下面的代碼所示,當調用o = 1時,顯然o2保持不變。如果我想讓o2更改o更改時如何操作?如何引用對象而不是複製它?

var o = { 
    a: { 
    b:2 
    } 
}; 
// 2 objects are created. One is referenced by the other as one of its property. 
// The other is referenced by virtue of being assigned to the 'o' variable. 
// Obviously, none can be garbage-collected 


var o2 = o; // the 'o2' variable is the second thing that 
      // has a reference to the object 
o = 1;  // now, the object that was originally in 'o' has a unique reference 
      // embodied by the 'o2' variable 

回答

2

您可以用封閉的幫助下做到這一點:

function Closure() { 
    var o = { 
     a: { 
     b:2 
     } 
    }; 

    this.getO = function() { 
     return o; 
    }; 
} 

var closure = new Closure(), 
    newO = closure.getO(); 
newO.a = 111; 

console.dir(closure.getO()); 
1

o不是對象而只是一個參考。您只是將其重新分配到1,但您並不真正覆蓋或更改o的以前引用的對象。

1

在JavaScript中,變量總是有對象的引用。他們從不復制。

這裏是你做什麼:

var o = { 
    a: { 
    b:2 
    } 
}; 

創建一個新的對象和「o」被引用到該對象。

var o2 = o; 

現在o和o2都引用了您最初創建的同一個對象。

o = 1; 

現在,這裏是棘手的部分。 在這裏,您將數字1分配給'o'變量,該變量先前指的是您創建的對象。 'o2'仍然指那個對象。 但是現在,'o'不再指對象,它被強制爲Number類型。 (簡單來說,是指強制類型轉換)

1

JS原始整數和字符串是按值傳遞,而對象是通過引用傳遞。

達到你願意,你可以使用閉包是什麼:

var o = { 
    a: { 
    b:2 
    } 
}; 

var o2 = function() { return o; }; 
o = 1; 
console.log(o2()); 
相關問題