2013-10-29 20 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

相關問題