【问题标题】:How to instantiate a chain of objects in JavaScript如何在 JavaScript 中实例化对象链
【发布时间】:2013-10-29 13:06:11
【问题描述】:

我有一段时间想知道是否有更快的方法在 javascript 中实例化对象链。

假设我们有以下“对象链”

window.myobject1.myobject2.myobject3 = {}

这当然行不通.. 因为 object1 和 object2 没有被实例化.. 但是..要让它工作..我必须做类似的事情:

window.myobject1 = {}
window.myobject1.myobject2 = {}
window.myobject1.myobject2.myobject3 = {}

这看起来很傻……在更现实的情况下……假设我们有

window.server.responses.currentuser.id

其中 server、responses 和 currentuser 只是充当“命名空间”/空实体.. 有什么方法可以告诉 javascript 将整个链实例化为对象吗?.. 所以我不需要在新行上实例化链的每个部分?

这可能是一个不好的例子,但我想你明白了.. 例如我可能还有:

window.server.responses.currentuser.id
window.server.responses.theotherusers.personone.id
window.server.responses.labels.personname

等等。

提前致谢!

【问题讨论】:

  • 如何一次性初始化它:myobject1 = {myobject2:{myobject3:{}}};?

标签: javascript object instances


【解决方案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);

【讨论】:

    猜你喜欢
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多