【问题标题】:Using JavaScript namespacing使用 JavaScript 命名空间
【发布时间】:2013-02-13 02:04:48
【问题描述】:

我正在尝试将此代码转换为命名空间以使其更清洁并避免污染全局命名空间。我对此很陌生,可以使用一些指导或示例如何将以下代码转换为 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。

【问题讨论】:

  • runValidate 函数真的有必要吗?它只为您节省 7 个字符。
  • 谢谢。我应该怎么做?
  • 直接从按钮调用validator.validate(this.form)

标签: javascript namespaces


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回答。我应该对我的 runValidate 函数做同样的事情吗?我将如何设置 var 验证器?
  • 将 var validator = new Validator([ "username", "password"]);成为 var validator = new myNamespace.Validator([ "username", "password"]); ?
  • 正确,您现在调用new myNamespace.Validator 而不是new Validator。然后按照@Bergi 的建议使用validator.validate,我认为拥有runValidate 函数没有意义。
【解决方案2】:

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 以及命名空间中的任何其他根节点。

【讨论】:

  • 非常感谢。表单中按钮的函数调用是否保持不变?
  • 是的。即使这不是最好的方法,它也应该可以正常工作。
猜你喜欢
  • 2012-11-06
  • 2014-10-17
  • 2018-05-29
  • 1970-01-01
  • 2010-12-05
  • 2011-12-02
  • 2011-03-25
  • 2021-09-27
相关资源
最近更新 更多