2012-12-28 50 views
3

我用來享受使用js。現在我只是沮喪。我正在嘗試jsDoc由我的老闆購買的大量代碼。作者沒有提供API,因此我將使用jsDoc創建一個API。這是一個普通函數,構造函數還是兩者都不是?

不幸的是,代碼並不清晰,它包含大約10k行代碼在一個js文件中。過去我使用過對象文字,這不是對象文字。參數和功能不能用逗號分隔。另外,原型從未被使用,但是新的操作符是。我看過幾本書,命名空間似乎是最接近的'風格'。這是程序的通用流程。我的問題遵循這個例子。

(function() { 
var global = (function() {return this; }).call(); 
global.X = {}; 
})(); 

X.init = function(){ 
    X.MyObjectA = new X.FooA(); 
    X.MyObjectB = new X.FooB(); 
} 

X.FooA = function() { 
    var storeStuff; 
    do stuff 
    . 
    . 
    function bar(){ 
     var storeSomething; 
     do something 
     do somthing else 
     . 
     . 
     moreFunctions(){} 
     var moreVars; 
     . 
     . 

    } 

    this.anOccasionalFunctionLiteral = function(){} 
     . 
     . 
} 

X.FooB = function(){ 
    Similar contents of FooB() 
} 
. 
. 
. 
Continues forever... 

所以我的問題是:

  1. 什麼風格是這樣!?當我說風格時,我想我的意思是什麼是FooA和FooB?他們是否是對象?類?

  2. 如果它們不是X.FooA或X.FooB的成員,我應該給嵌套函數什麼標題。我已經被告知嵌套函數,包括bar(),不是對象的方法 FooA和FooB。

  3. 如果嵌套在對象內部的函數實際上不是其周圍對象的方法,它可以從任何地方調用它?或者是否適用正常範圍規則?

爲了讓生活更具可讀性和高興,我已經分類對象類似FooA和FooB構造函數及構造函數內部的任何方法,如酒吧(),作爲FooA和FooB的方法。這可能不正確,但至少它是有組織的。有什麼建議麼?

感謝您的幫助!

回答

1

1)我認爲你的命名空間預感是正確的。第一個自我執行的匿名函數獲取全局名稱空間。他們可能並沒有做一些簡單的事情,例如:

window.X = {}; 

因爲在'window'不是全局對象的環境中這樣做不起作用。 (就像服務器上的nodejs)

2)我不會調用這些方法。我個人認爲這取決於這些功能的實際功能是什麼。它們可能像進一步的命名空間或對象的構造函數一樣。如果他們大寫,作者可能更多地將它們看作命名空間或類,而不是方法。

3)酒吧()函數只能從X.FooA叫,要知道但是,它可以在X.FooA 被稱爲之前,它實際上是宣告

X.FooA = function() { 
    bar(); // this will work 
    function bar() { 
    alert('this will work'); 
    } 
} 

這是因爲當代碼評估時,函數聲明將被掛起到周圍函數的頂部。但是,X.FooA以外的條形函數將不可用。

我不認爲我會分類酒吧作爲一種方法。也許作爲一種「私人功能」或「私人方法」會更合適。

1

它看起來像FooA和FooB都包含在 'X' 對象中的類。定義的類中的匿名函數基本上是私有方法,而名稱函數是包含類的公共方法。

var x = { 
classA:function(){ 
    do class constructor stuff... 
    function myPrivateMethod(){do stuff...} 
    this.myPublicMethod = function(){do stuff...} 
}, 
classB:{another class contained in the object} 
}