2017-09-01 126 views
0

我是一個JavaScript語言開發人員,而不是通過使用jQuery按鈕單擊AJAX獲取數據。Javascript中的C#名稱空間機制

來自C#背景我沒有看到在Javascript中使用名稱空間的直接方法。我試圖用下面的代碼來模仿它。我的問題與using(namespace);方法有關,它將所有從命名空間對象複製到窗口對象。在搜索如何以模塊化方式處理javascript時,我還沒有遇到過這樣的編碼,我想知道以下幾點:1)這個模式是否有名字? 2)using(namespace);有什麼優點和缺點?

console.clear(); 
 

 
var System = { 
 
    IO: { 
 
OutletOption: { 
 
    Console: 1, 
 
    MessageBox: 2 
 
}, 
 
Outlet: function Outlet(outletOption) { 
 

 
    var _self = this; 
 
    var _outletOption = outletOption; 
 

 
    //private 
 
    _self.log = function(txt) { 
 
    console.log(txt); 
 
    }; 
 
    _self.messageBox = function(txt) { 
 
    alert(txt); 
 
    }; 
 

 
    //public 
 
    _self.out = function(txt) { 
 
    switch (_outletOption) { 
 
     case System.IO.OutletOption.MessageBox: 
 
     _self.messageBox(txt); 
 
     break; 
 
     case System.IO.OutletOption.Console: 
 
     _self.log(txt); 
 
     break; 
 
    } 
 
    }; 
 

 
    return { 
 
    out: _self.out 
 
    }; 
 
} 
 
    } 
 
}; 
 

 
function using(namespace, scope) { 
 
    console.log(scope); 
 
    for (var key in namespace) { 
 
scope[key] = namespace[key]; 
 
    } 
 
} 
 

 
(function() { 
 
    function execute() { 
 
    
 
//All your code goes here 
 
using(System.IO, this); 
 
var o = new this.Outlet(this.OutletOption.Console); 
 
o.out("Some test text."); 
 

 
    }; 
 
    return { 
 
execute: execute 
 
    }; 
 
})().execute();

+0

我建議你使用像Angularjs這樣的框架,以便在模塊化方面有一個更好的方法。 – PhiceDev

+1

您的'using()'函數會污染全局*名稱空間*,並且很可能導致衝突,這就是名稱空間應該阻止開始的類型。您可以使用嵌套對象和JavaScript來模擬名稱空間,Javascript有一個'with'關鍵字來設置一個隱式名稱空間,但是它被棄用,因爲它有各種各樣的問題。 –

+0

@MikaelLennholm它污染的好處!謝謝。 –

回答

0

JavaScript沒有命名空間。如果你來自C#,使用TypeScript和Angular2 +會更容易。 TypeScript是帶有類型的JavaScript。

+0

謝謝你的你的補充。我考慮過TypeScript。讓我回想起使用它的是所需的類型定義:外部庫可能沒有它們,或者很快就過時了。我必須說,你的答案不是對我的回答,更多的是評論,因爲它不回答我提出的兩個問題。 –

+1

我已經說過,JavaScript沒有名稱空間:) –