2011-12-07 39 views
4

上我希望能夠通過給予不符號路徑值來設置私人對象上的屬性。難點在於這個對象在關閉狀態,所以我不能直接訪問它來設置正常方式的值(例如,dot.notation.path = 'new value')。這似乎很奇怪,但我想不出明顯的辦法。如何設置特定屬性的私人對象

實施例:

// setter function 
function set(path, change){ 
    var privateObject = { 
     a: 'a', 
     b: 'b', 
     c: { 
      d: 'd', 
      e: 'e' 
     } 
    } 

    privateObject[path] = change; 
    return privateObject; 
} 

// execution 
var result = set('c.d', 'new value'); 

// desired result 
//{ 
// a: "a" 
// b: "b" 
// c: { 
// d: "new value", 
// e: 'e' 
// } 
//} 

// actual result 
//{ 
// a: "a" 
// b: "b" 
// c: { 
// d: 'd', 
// e: 'e' 
// } 
// c.d: "new value" 
//} 

工作實施例:

Failing JSFiddle Example >>

[更新]替換示例:

Working JSFiddle Example >>

回答

2

這不會有什麼私人物品或倒閉,還有很多要做的事實,

someObject['c.d'] 

不等同於

someObject['c']['d'] 

someObject.c.d 

你可以做一些構造,通過將您的path字符串。分隔符並迭代應用索引操作符以達到所需的效果。

然而,整個演習似乎是一種毫無意義的。如果你正在對其範圍之外的私有對象執行任意更改,爲什麼不添加一個獲取私有對象的機制並直接對它進行變異?

+1

雖然如此,這並沒有真正回答這個問題。它只是說他做的事情不會奏效 - 他已經知道了,因爲它失敗了。 :-) –

+0

它仍然澄清事項 –

+0

@JonasH你會建議這樣的事情嗎? http://jsfiddle.net/spwDp/10/ – wilsonpage

5

你真的很接近,但括號表示法不會爲你處理點(不能  —點是完全的屬性名稱有效的字符)。你必須做你自己:

function set(path, change){ 
    var privateObject = { 
     a: 'a', 
     b: 'b', 
     c: { 
      d: 'd', 
      e: 'e' 
     } 
     }, 
     index, 
     parts, 
     obj; 

    parts = path.split("."); 
    obj = privateObject; 
    if (parts.length) { 
    index = 0; 
    while (index < parts.length - 1) { 
     obj = obj[parts[index++]]; 
    } 
    obj[parts[index]] = change; 
    } 
    return privateObject; 
} 

Live demo

我粉碎了斷,這不是對舊發動機的超高效,我沒有刻意去探索故障模式,但你的想法:斯普利特你在點上給出的路徑,然後使用頁面的每個組成部分。

+0

很酷你明白我的意思!這是在私人對象上設置特定值的最簡單方法嗎? – wilsonpage

+0

@pagewil:缺少將路徑作爲單獨的字符串提供,這非常簡單。 :-) –

+0

你覺得這個怎麼樣? http://jsfiddle.net/spwDp/10/ – wilsonpage