JavaScript命名空间的首选技术

如果我不开始使用某种命名空间技术,我的代码将变成一团糟。 我对编程大型JavaScript项目比较陌生,但在C ++ / java / python等系统编程方面拥有丰富的经验。

基本上我试图确定哪个是创建JavaScript命名空间的首选方法,以及每种方法的优缺点。

例如,我可以使用以下三种方法之一:

var proj.lib.layout = {
  "centreElem":     
  function (elem, W, H){

  },

  "getAbsolutePosition":
  function (elem){

  }
};

要么

var proj.lib.layout = {};
(function(){
  var l = proj.lib.layout;

  l.centreElem = function (elem, winW, winH){
    ..
  }

  l.getAbsolutePosition = function (elem){
    ..
  }
})();

要么

var proj.lib.layout = new function(){
  function centreElem(elem, W, H){
    ..
  }

  function getAbsolutePosition(elem){
    ..
  }

  this.centreElem          = centreElem;
  this.getAbsolutePosition = getAbsolutePosition;
} ();

还有其他方法可以做得太明显,但这是我见过和想到的第一个。 任何人都可以说有一种“最好”的技术,或者至少指出我可以评估哪些最适合我的利弊?


请注意,您必须先创建所有中介对象,然后才能将其分配给这样的子对象:

window.one.two.three = {}; // fails
window.one = { two: { three: {} } };

考虑编写一个名称空间方法,这样你可以统一你的名字空间代码。 例如:

window.proj = {};
// n - {String} - A string representing a namespace to create on proj
// returns an object you can assign values to
window.proj.namespace = function(n) { /* ... */ };

(function(NS) {
    NS.myMethod = function() {};
    NS.myOtherMethod = function() {};
    NS.myProperty = "FOO";
})(proj.namespace('lib.layout'));

assert(proj.lib.layout.myProperty === "FOO");

我最喜欢的方法是将一个对象(名称通常很短,2-3个字符,全部大写)作为包含所有其他对象的命名空间。

下面显示的方法(与您的第二个示例最接近)还显示了如何隐藏所有私有函数:

// In this example the namespace is "QP"
if (!QP) {
    var QP = {};
};

// Define all objects inside an closure to allow "private" functions
(function() {

     QP.examplePublicFunction = function() {
         ...
     }

     function examplePrivateFunction() {
         ...
     }

})();

这是许多其他JavaScript库所使用的方法,例如json2.js

我从来没有真正感觉到需要将我的名称空间划分为子名称空间。


Google Closure Javascript库使用这种风格(与您的任何示例不完全相同)

goog.math.clamp = function(value, min, max) {
  return Math.min(Math.max(value, min), max);
};

我会坚持这种简单的风格。 不要打扰自执行匿名函数包装。 你的例子中的那个实际上并没有做任何有用的事情。

链接地址: http://www.djcxy.com/p/17043.html

上一篇: Preferred technique for javascript namespacing

下一篇: Javascript namespacing/prototype issue