0

我正在尝试将此代码转换为名称空间以使其更清洁并避免污染全局名称空间。我对此相当陌生,可以使用一些指导或示例如何将以下代码转换为 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 验证方法太过分了!)我从类似“runValidate(this.form)”这样的表单中的按钮调用这个 runValidate。

4

2 回答 2

2

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

var myNamespace = {};
myNamespace.Validator = function(fields) {
   ...
}
myNamespace.Validator.prototype.validate = function(form) {
   ...
}
于 2013-02-27T10:35:08.360 回答
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"]);

这将防止您污染全局命名空间,但您仍然会有一些全局变量:MyApp在这种情况下,还有命名空间中的任何其他根节点。

于 2013-02-27T10:50:02.160 回答