帮酷LOGO
0 0 评论
文章标签:JAVA  Javascript  Names  

什么是命名空间

命名空间是一个容器for标识符functions函数方法和所有这些属性的集合。 它给 direction的内容提供了一个级别,以便它能够有所区分和组织。

为什么需要命名空间

我们必须从任何语言或者其他语言中知道名称空间。 它不允许我们对代码库进行污染,并使我们的代码更清晰,并避免意外和预期冲突。

为此,我们需要做的是在应用程序中创建一个命名空间并使用它。

无论是在现代的应用程序中,还是在末尾,都必须拥有第三方库和组件,所以在任何现代。

JavaScript中命名空间的重要性

不幸的是,默认情况下,不提供名称空间。 所以我们在 JavaScript 中创建的任何东西都是 global,并且通过添加更多的元素来继续污染这个 global namespace

但是好消息是,我们可以在 JavaScript创建 create create namespace,而且很容易 that。
我们知道,在中,一切都是对象,创建对象很简单。 我们可以很容易地通过一些小的调整来实现命名空间。

让我们来看看JavaScript是如何使所有东西都成为全局

//declare a functionfunction calculateTax(item) {
 return item.price * 1.40;
}var product = function (cost) {
 this.cost = cost;
 this.getCost = function(){
 returnthis.cost;
 };
};function doTaxCalculations() {
 var p = new product(100);
 alert(calculateTax(p.getCost()));
}

在 上面 代码中,这两个函数和类都被放在全局空间中。
它是一个简单的代码库,但它包含 3个全局项( calculateTaxproductdoTaxCalculations )。
如果我们使用 3rd 方库,并且它们也包含相同的名称,那么这三个将真正使我们陷入麻烦。
如果它在其他库之前使用,它将被库覆盖,反之亦然。

JavaScript示例命名空间

实际上,JavaScript是一个只包含所有函数方法,方法和变量的全局对象,它是一个单一的全局对象。 这里'MYAPPLICATION'充当一个的JavaScript命名空间以及惟一包含所有其他项的global object

var MYAPPLICATION = {
 calculateTax: function (item) {
 return item * 1.40;
 },
 product: function (cost) {
 this.cost = cost;
 this.getCost = function(){
 returnthis.cost;
 };
 },
 doTaxCalculations: function () {
 var p = new MYAPPLICATION.product(100);
 alert(this.calculateTax(p.getCost()));
 }
}

要访问任何方法或者变量,需要通过 MYAPPLICATION 获取它。

var newProduct = new MYAPPLICATION.product(200);
alert(p.getPrice());

我们不仅可以像 上面 这样的单一命名空间,而且还可以创建基于xml的嵌套的JavaScript命名空间( )。
让我们看一看嵌套的名称空间示例。

嵌套的JavaScript命名空间

它只不过是一个基于xml的命名空间 inside a a,它为复杂的JavaScript应用程序应用程序提供了更好的模块化。

var MYNESTEDAPPLICATION = {
 MODEL: {
 product: function (price) { 
 this.price = price; 
 this.getCost = function(){
 returnthis.price;
 };
 }
 },
 LOGIC: {
 calculateTax: function (item) {
 return item * 1.40;
 },
 doCalculations: function () {
 var p = new MYNESTEDAPPLICATION.MODEL.product(100);
 alert(this.calculateTax(p.getCost()));
 }
 }
}
便笺
Do your naming convention in such a manner that it will be self explanatory and 
not conflict other Library. May be I am not that good at those.

如果命名空间不存在,则创建它

像 上面 一样,我们使用单个全局对象,但它可能与其他全局对象冲突。
为了避免这个问题,我们可以在创建它之前检查它是否存在,这是一个很好的实践。

// not safe, if there's another object with this name we will overwrite itvar MYSAMPLEAPP = {};// We need check before we create the namespaceif (typeof MYSAMPLEAPP === "undefined") {
 var MYSAMPLEAPP = {};
}// shorter versionvar MYSAMPLEAPP = MYSAMPLEAPP || {};

第1 种方法是创建名称空间最安全的方法,但是我们可以通过编写一个函数来更轻松地创建它,这将创建我们的基于 xml。

创建命名空间的函数

我们只需要调用一个简单的函数和一些参数来创建我们的名称空间。 然后,我们可以定义该命名空间中的所有函数和变量。

var MYNAMESPACE = MYNAMESPACE || {};var newNamespace = MYNAMESPACE.createNameSpace("MYNAMESPACE.COUNTRY.STATES");
newNamespace.product = function(price) {
 this.price = price;
 this.getCost = function(){
 returnthis.price;
 }
};
MYNAMESPACE.createNameSpace = function (namespace) {
 //get the namespace string and split itvar namespaceArr = namespace.split(".");
 var parent = MYNAMESPACE;
 // excluding the parentif (namespaceArr[0] === "MYNAMESPACE") {
 namespaceArr = namespaceArr.slice(1);
 }
 // loop through the array and create a nested namespace for (var i = 0; i < namespaceArr.length; i++) {
 var partname = namespaceArr[i];
 // check if the current parent already has the namespace declared// if it isn't, then create itif (typeof parent[partname] === "undefined") {
 parent[partname] = {};
 }
 // get a reference to the deepest element in the hierarchy so far parent = parent[partname];
 }
 // empty namespaces created and can be used.return parent;
};

基本上,createNameSpace 函数分割 string 并从它创建一个嵌套的命名空间。

<code>MYNAMESPACE.createNameSpace("MYNAMESPACE.COUNTRY.STATES");</code>

输出

var MYNAMESPACE = {
 COUNTRY: {
 STATES: {
 }
 }
}

命名空间别名

我们可以通过在局部变量中简单地别名名称空间来实现这里目的:

var state = MYNAMESPACE.COUNTRY.STATES;

使用 state 而不是整个命名空间来获取所有变量和函数。

便笺

但是,上面关于命名空间的解决方案在大多数情况下是非常有效和有用的。
但在某些情况下,这可能不是最好的选择。
这里,只有单一全局实例,但是没有什么能阻止我们直接访问内部变量。
因此,我们需要控制对 private 变量的访问。 这可以通过 "使用模块创建模块化应用程序"来实现,它将封装日期。

使用模块

MYAPP.MODEL.PRODUCTS.product = function(cost) {
 //cost is the private variablevar cost = cost; 
 return {
 isTaxable: true,
 getCost: function(){ 
 return cost; 
 }
 };
};

由于 closure,函数可以访问,否则无法直接访问。
isTaxablegetCostpublic

有许多模式可以实现这一点。
像让所有东西变成 private 并公开我们需要公开的东西一样

MYAPP.MODEL.PRODUCTS.product = function(cost){
 //everything privatevar cost = cost; 
 var isTaxable = true;
 var getCost: function(){ 
 return cost; 
 };
 //expose what you needreturn {
 isTaxable: isTaxable,
 getCost: getCost
 };
};

尽管 上面 编写的示例中可能存在一些安全问题,但我们可以使它的更加完善。
我们可以通过对任何变量 inside的引用来防止访问命名空间。 我们可以遵循更多的模式来达到这个目的。

结束语

xml - 命名空间的使用使得JavaScript代码模块化模块化和结构也易于读取。理解和修改。 因此,如果不污染全局命名空间,我们可以实现所有这些事情,我们必须使用全局命名空间,但是我们不会在这里搞乱这些内容。

希望这有帮助。感谢阅读。



文章标签:JAVA  Javascript  Names  

Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语