2012-11-29 28 views
1

比方說,我們有,在Javascript中,像:JavaScript屬性鏡像到另一個實例

obj1.prop1.prop1_1.prop1_1_1 = 3; 

如果這就是所謂的,我要值3在同一棵樹的位置設置,但在obj2的,好像我叫:這個

obj2.prop1.prop1_1.prop1_1_1 = 3; 

所有與obj2的最初未填充prop1.prop1_1.prop1_1_1約束。

我想第一步將重寫obj1.prop1,因此它返回obj2.prop1。但obj2.prop1需要分配給與obj1.prop1相同類型的實例。我們怎麼做到這一點?

回答

1

如果我理解正確的話,obj1.prop1.prop1_1obj2.prop1.prop1_1是不是同一個對象,你想對前者propertly設置prop1_1_1設置後者相同的屬性。

這是可能property getters and/or setters截至ES5,但我不認爲我會推薦它。 :-)

這裏就是上obj2.prop1.prop1_1.prop1_1_1吸氣從obj1的獲取價值的例子:

var obj1 = { 
    prop1: { 
     prop1_1: { 
      prop1_1_1: 42 
     } 
    } 
}; 
var obj2 = { 
    prop1: { 
     prop1_1: { 
     } 
    } 
}; 
Object.defineProperty(obj2.prop1.prop1_1, "prop1_1_1", { 
    get: function() { 
     return obj1.prop1.prop1_1.prop1_1_1; 
    } 
}); 
console.log("obj1.prop1.prop1_1.prop1_1_1 = " + obj1.prop1.prop1_1.prop1_1_1); // 42 
console.log("obj2.prop1.prop1_1.prop1_1_1 = " + obj2.prop1.prop1_1.prop1_1_1); // 42 
obj1.prop1.prop1_1.prop1_1_1 = 3; 
console.log("obj1.prop1.prop1_1.prop1_1_1 = " + obj1.prop1.prop1_1.prop1_1_1); // 3 
console.log("obj2.prop1.prop1_1.prop1_1_1 = " + obj2.prop1.prop1_1.prop1_1_1); // 3 

Live Copy(看在控制檯)| Source

+0

只是爲了澄清, ES5意味着ECMAScript 5,它是用於實現的Javascript標準。最新的瀏覽器支持它,但最值得注意的是IE8和更早版本不支持它。請參閱:http://kangax.github.com/es5-compat-table/以獲取支持「屬性初始值設定器中的Setter」的瀏覽器列表。但我的答案將適用於這些瀏覽器。 – Hoffmann

+0

謝謝T.J.這解決了我的問題的一部分。我會需要雖然obj2根本沒有填充,所以prop1和prop1_1將需要在obj2上動態創建,並能夠在之後解析obj2的屬性樹。通過這種方式,我可以從obj2知道所有已經做成obj1的修改。但我想這是不可能的。實際上,爲了闡明我的意圖,我需要讓obj2像觀察者一樣對obj1進行修改。 – Alio

+0

@Alio:如果你需要'obj2'來反映* obj1所做的所有更改,爲什麼不只是'obj2 = obj1;'?然後這兩個變量都指向同一個對象樹,所以(當然)通過其中一個變化所做的任何更改都可以通過另一個變量來看到,因爲它們都指向同一棵樹。如果這不起作用,我很好奇:用例是什麼? –

1

如果T.J.克羅德的假設是正確的,你可以做到以下幾點:

obj1.prop1.prop1_1.prop1_1_1= [3] 


obj2.prop1.prop1_1.prop1_1_1= obj1.prop1.prop1_1.prop1_1_1 
現在

如果你改變obj2.prop1.prop1_1.prop1_1_1 [0],obj1.prop1.prop1_1.prop1_1_1 [0]也將被改變。

這是因爲當你將它定義爲[3]時,它實際上會創建一個Array對象並將它的引用(aka指針)存儲在obj1.prop1.prop1_1.prop1_1_1中,所以obj1.prop1.prop1_1.prop1_1_1和obj2都是如此。 prop1.prop1_1.prop1_1_1將對同一個數組具有相同的引用。內存中只有一個數組,但兩個引用它,改變一個也會改變另一個。

如果使用obj1.prop1.prop1_1.prop1_1_1 = 3,則在這種情況下,prop1_1_1是一個基元,而不是對對象的引用。所以,如果你說

obj1.prop1.prop1_1.prop1_1_1= obj2.prop1.prop1_1.prop1_1_1 

它將實際值3複製到其他變量,使得它在內存中的兩個不同的地方保存值3,改變一個不會改變的其他

相關問題