2012-06-17 16 views
3

我終於問這個問題,因爲我從來沒有找到答案。如果我有一個結構的JavaScript對象像這樣:我應該如何組織一個對象來保持所有事物儘可能分離?

var someObj = { 

    "categoryA" : { 
     "func1" : function(){}, 
     "func2" : function(){}, 
    }, 

    "categoryB" : { 
     "func3" : function(){}, 
     "func4" : function(){}, 
    } 

} 

func4想要呼叫func2。我有什麼方法可以不用說someObj.func2()?在我看來,這很難看,因爲它確保應用程序不能輕易重命名,並且看起來更緊密地耦合了內部功能。或者,它是如何組織起來的,它不被視爲一個問題?

+0

你沒有得到答案,因爲唯一有效的答案是你對你的js對象有很高的期望。 – Ash

+0

從標題中刪除了JSON,因爲它與JSON無關。 –

回答

1

你總是可以折射你的對象聲明到的東西,看起來像這樣:

var someObj = (function() { 

    function func1(){} 
    function func2() {} 
    function func3() {} 

    function func4() { 
     func2(); 
    } 

    var self = { 
     "categoryA" : { 
      "func1" : func1, 
      "func2" : func2, 
     }, 

     "categoryB" : { 
      "func3" : func3, 
      "func4" : func4, 
     } 
    }; 

    return self; 
}()); 

它通常被稱爲「模塊模式」。

+0

嗨。每當我看到模塊模式時,它只是在小例子中,因此我有(可能錯誤地)認爲它不是如何組織大型應用程序。 還有一個問題:如果我像上面所說的那樣組織它,然後想要在「categoryC」中動態加載並將其添加到我的obj中,那將如何工作?如果我希望categoryC的函數使用其他類別的函數,我想我回到使用someObj.func2()? – TedTedTed

+0

@TedTedTed它總是取決於你的項目需要什麼。根據我的經驗,在大型項目中使用它們非常有用,因爲當您將代碼劃分爲小模塊時,這些模塊中的每一個都有自己的內部狀態,這是其他任何設備都無法觸及的。在模塊內部聲明的變量和函數是「私有的」(只要你不返回它們)。 – HoLyVieR

+0

@TedTedTed我不太清楚你的意思是「動態加載」其他類別,但只要你的「categoryC」在你的「模塊」內聲明,它將有權訪問其他成員,你將能夠直接調用該函數。 – HoLyVieR

1

這是不可能的,原因如下。試想一下,這樣的事情:

var obj1 = {}, obj2 = {}; 

var categoryA = { 
    "func1" : function(){}, 
    "func2" : function(){}, 
}; 

var categoryB = { 
    "func3" : function(){}, 
    "func4" : function(){}, 
}; 

obj1.categoryA = categoryA; 
obj1.categoryB = categoryB; 

obj2.categoryA = categoryA; 
obj2.categoryB = categoryB; 

你可以看到,obj2.categoryB.func4()不知道該怎麼辦。

1

你可以在你的模塊中使用一些「私有」變量名(在我的例子中爲'me')並且將它「導出」到另一個變量以供外部使用('someObj')。

var someObj = (function(){ 
    var me = { 
    A:{ 
     fn1:function() {return 1} 
    }, 
    B:{ 
     fn2:function() {return me.A.fn1()} 
    } 
    }; 
    return me; 
})(); 

someObj.B.fn2() 
相關問題