2013-02-27 138 views
0

我想将此代码转换为命名空间以使其更清洁并避免污染全局命名空间。我是相当新的这一点,可以使用一些指导或例子我会怎么下面的代码转换成JavaScript命名空间...使用javascript命名空间

 function Validator(fields) { 
    this.fields = fields; 
} 

Validator.prototype.validate = function(form) { 
    for(var i = 0, l=this.fields.length; i < l; i++) { 
    alert(this.fields[i].value); 
     if (this.fields[i].value == 0) { 
      alert("The field is empty"); 
      return false; 
     } 
    } 
} 

var validator = new Validator([ "username", "password"]); 

function runValidate(form) { 
validator.validate(form); 
    } 

(我知道这OO的方法来验证OTT!)我从像这样的“runValidate(this.form)”形式的按钮中调用此runValidate。感谢您的任何帮助或建议。

+0

难道'runValidate'函数真的需要吗?它只能节省7个字符。 – Bergi 2013-02-27 10:14:25

+0

谢谢。我该怎么做而不是呢? – 2013-02-27 13:29:18

+0

只需从按钮 – Bergi 2013-02-27 13:43:44

回答

2

命名空间只是JavaScript对象,例如

var myNamespace = {}; 
myNamespace.Validator = function(fields) { 
    ... 
} 
myNamespace.Validator.prototype.validate = function(form) { 
    ... 
} 
+0

感谢您的回答。我应该使用我的runValidate函数吗?我将如何设置var验证器? – 2013-02-27 13:28:57

+0

will var validator = new Validator([“username”,“password”]);变成var validator = new myNamespace.Validator([“username”,“password”]); ? – 2013-02-27 13:54:28

+0

正确,您现在调用'new myNamespace.Validator'而不是'new Validator'。然后使用validator.validate,就像@Bergi所建议的那样,我认为没有'runValidate'函数的意义。 – 2013-02-27 14:28:38

1

JavaScript没有本地命名空间,但你可以使用简单明了的对象来模拟。这里有一个简单的实现一个命名空间效用函数:

function namespace(namespaceString) { 
    var nodes = namespaceString.split('.'), 
     parent = window, 
     currentNode;  

    for(var i = 0, length = nodes.length; i < length; i++) { 
    currentNode = nodes[i]; 
    parent[currentNode] = parent[currentNode] || {}; 
    parent = parent[currentNode]; 
    } 

    return parent; 
} 

你可以使用这样的:

var MyApp = namespace("MyApp"); 
MyApp.Validator = function(fields) { 
    this.fields = fields; 
} 

var validator = new MyApp.Validator(["username", "password"]); 
// this also works: 
var validator = new namespace("MyApp.Validator")(["username", "password"]); 

这将让你poluting全局命名空间,但你仍然有一些全局变量: MyApp在这种情况下和您的命名空间中的任何其他根节点。

+0

非常感谢。表单中按钮的函数调用是否保持不变? – 2013-02-27 12:14:54

+0

是的。即使这不是最好的方式,它应该可以正常工作。 – cezar 2013-02-27 13:29:15