2013-10-29 19 views
2

我有一段时间想知道是否有更快捷的方式来实例化JavaScript中的一系列对象。如何在JavaScript中实例化一系列对象

比方说,我们具有例如

window.myobject1.myobject2.myobject3 = {} 

这将ofcourse不行..因为object1和对象2不实例化下面的“对象链” .. 但是..得到这个工作..我会做这样的事情:

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

它只是似乎只是愚蠢的。在一个更现实的情况下..可以说,我们有

window.server.responses.currentuser.id 

其中服务器,响应和currentuser只是充当“命名空间”/空enities .. 会有什么办法我可以告诉javascript实例化整个链作为对象?..所以我不需要实例化链条的每个部分放在一个新的线上?

这可能是一个坏榜样,但我猜你得到它.. 比如我可能也有:

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

等提前

谢谢!

+5

快来看看一次初始化这一切:'myobject1 = {myobject2:{myobject3:{}}};'? – raina77ow

回答

-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); 
+1

-1这不是惯用的JavaScript – naomik

1

它只是似乎只是愚蠢

KISS代表保持简单,愚蠢的。所以,是的,即使它看起来很愚蠢,但它是有效的。

如果你不喜欢

var myobject1 = {myobject2: {myobject3: {}}}; 

你可以使用一些实际的JavaScript组成

var MyObject1 = function(myobject2) { 
    this.myobject2 = myobject2 || new MyObject2(); 
}; 

var MyObject2 = function(myobject3) { 
    this.myobject3 = myobject3 || new MyObject3(); 
}; 

var MyObject3 = function() { 
    this.foo = "bar"; 
}; 


if (!window.myobject1) { 
    window.myobject1 = new MyObject1(); 
} 

console.log(window.myobject1); 

虽然是一个完全人为的例子,如果你有类似的结构

server.responses.currentuser.id 

i牛逼看来愚蠢使用你原来的域模型来创建相同的客户端结构


这就是说,如果你仍然想打破惯例,而不是一些廉价的/复制粘贴的解决方案,这里有一个包这可以做很多你正在寻找的东西。它实际上提供了一些很好的单元测试来支持这些功能。

https://github.com/deoxxa/dotty

相关问题