2017-09-01 145 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没有名称空间:) –

相关问题