我希望能够通过给出值的非符号路径来设置私有对象的属性.困难在于此对象在闭包内,因此我无法直接访问它以正常方式设置值(例如.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"
//}
Run Code Online (Sandbox Code Playgroud)
工作实例:
[更新]替代示例:
你真的很接近,但括号表示法不会为你处理点(它不能 - 点是属性名称的完全有效字符).你必须自己做:
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;
}
Run Code Online (Sandbox Code Playgroud)
我把它打破了,它在旧引擎上并不高效,而且我没有费心去探索失败模式,但是你明白了:拆分你在点上给出的路径,然后使用页面的每个组成部分.