如果我不开始使用某种命名空间技术,我的代码将变成一团糟。我对编写大型JavaScript项目相对较新,但在C ++ / java / python等系统编程方面有丰富的经验。
基本上我正在尝试确定哪种方法是创建javascript命名空间的首选方法,以及每种方法的优缺点。
例如,我可以使用以下三种方法之一:
var proj.lib.layout = {
"centreElem":
function (elem, W, H){
},
"getAbsolutePosition":
function (elem){
}
};
OR
var proj.lib.layout = {};
(function(){
var l = proj.lib.layout;
l.centreElem = function (elem, winW, winH){
..
}
l.getAbsolutePosition = function (elem){
..
}
})();
OR
var proj.lib.layout = new function(){
function centreElem(elem, W, H){
..
}
function getAbsolutePosition(elem){
..
}
this.centreElem = centreElem;
this.getAbsolutePosition = getAbsolutePosition;
} ();
还有其他方法可以做到这一点,但这些是我见过和想到的第一个。任何人都可以说有一种“最好的”技术,或者至少指出一些利弊,我可以从中评估哪种方式最适合我?
答案 0 :(得分:3)
请注意,您必须先创建所有中间对象,然后才能分配到以下子对象:
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");
答案 1 :(得分:1)
我首选的方法是将一个对象(其名称通常很短,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
我从来没有真正觉得需要将我的命名空间细分为子名称空间。
答案 2 :(得分:0)
基本上所有三个示例都使用相同的“命名空间”技术,即创建一个基本对象(您的命名空间),然后使用您的函数对其进行扩充。
根名称空间通常是大写字母:
if (typeof (MYAPP) == "undefined" || !MYAPP) {
var MYAPP= {}
};
然后,您可以通过各种方式向此基础对象添加功能。在你的代码中你显示了其中的三个,但每个结果都有相同的结果,你可以调用这两个函数:
proj.lib.layout.centreElem(elem, W, H);
proj.lib.layout. getAbsolutePosition(elem);
答案 3 :(得分:0)
Google Closure Javascript Library使用此样式(与您的任何示例完全不同)
goog.math.clamp = function(value, min, max) {
return Math.min(Math.max(value, min), max);
};
我会坚持这种简单的风格。不要为自动执行的匿名函数包装器而烦恼。你的例子中的那个实际上并没有做任何有用的事情。