如何在JavaScript中实例化一系列对象

时间:2013-10-29 13:06:11

标签: javascript object instances

我有一段时间想知道是否有更快的方法在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

等。

提前致谢!

1 个答案:

答案 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);