我有一段时间想知道是否有更快的方法在javascript中实例化一系列对象。
让我们说我们有例如以下“对象链”
window.myobject1.myobject2.myobject3 = {}
这将不起作用..因为object1和object2没有实例化.. 然而..要让它发挥作用..我必须做类似的事情:
window.myobject1 = {}
window.myobject1.myobject2 = {}
window.myobject1.myobject2.myobject3 = {}
在一个更现实的案例中,这只是愚蠢......让我们说有了
window.server.responses.currentuser.id
其中服务器,响应和当前用户只是充当“名称空间”/空元素.. 有没有办法告诉javascript将整个链实例化为对象?所以我不需要在新行上实例化链的每个部分?
这可能是一个不好的例子,但我想你明白了...... 例如,我可能也有:
window.server.responses.currentuser.id
window.server.responses.theotherusers.personone.id
window.server.responses.labels.personname
等。
提前致谢!
答案 0 :(得分:-1)
我以前回答过这个问题,但似乎无法找到它,所以不能将其标记为重复(呵呵)。无论如何,你基本上可以用一个函数来做:
function deep_set (obj,path,value) {
var name = path.shift();
if (path.length) {
if (typeof obj[name] == undefined) {
obj[name] = {};
}
if (typeof obj[name] == 'string' || typeof obj[name] == 'number') {
throw new Error('attempted to access string or number as object');
}
deep_set(obj[name],path,value);
}
else {
obj[name] = value;
}
}
所以你现在可以做到:
deep_set(window,['server','responses','currentuser','id'],3);
无需在每一步手动测试typeof == undefined
。
只需稍加更改,您就可以按照自己的方式使用API:
window.deep_set(['server','responses','currentuser','id'],3);
// or
deep_set(window,'server','responses','currentuser','id',3);
// or
deep_set(window,'server.responses.currentuser.id',3);