我一直在尝试通过为我的代码创建一个命名空间来更好地使我的javascript代码更好,这样就没有全局变量/函数冲突,并且还将所有内容放在匿名函数中,所以除非另有明确表示,否则一切都是私有的通过return语句。
Atm,我得到一个“未捕获的类型错误:对象不是函数”
var Namespace = (function() {
//private variables/functions
var a;
var b;
function priv_func1() {
//do stuff
}
//public variables/functions
return {
pub_var1: b,
pub_func1: function() {
//do stuff
}
};
})();
$(document).ready(function() {
var myName = new Namespace();
myName.pub_func1();
}
所以当我删除命名空间定义末尾的()将函数声明转换为函数表达式时,我没有得到任何错误,但在示例中我看到它们中有(),所以我我想知道发生了什么。
我也将它放在Namespace定义的开头,以便在用户意外省略new关键字时进行更正。
if (!(this instanceof Namespace))
return new Namespace();
编辑:另外,我应该在命名空间定义之前或之后放置我的文档就绪函数。
答案 0 :(得分:2)
有效!您不必使用新,因为您尚未定义constructor
。
$(document).ready(function() {
Namespace.pub_func1();
});
您尝试做的事情是通过modules
创建构造函数来完成的。
让我向您展示 Javascript:Design Patterns
[..]但有时它是 使用构造函数创建对象更方便。你仍然可以 使用模块模式。唯一的区别在于即时功能 包装模块将在最后返回一个函数,而不是一个对象。
考虑以下创建构造函数的模块模式示例
MYAPP.utilities.Array:
MYAPP.namespace('MYAPP.utilities.Array');
MYAPP.utilities.Array = (function () {
// dependencies
var uobj = MYAPP.utilities.object,
ulang = MYAPP.utilities.lang,
// private properties and methods...
Constr;
// end var
// optionally one-time init procedures
// ...
// public API -- constructor
Constr = function (o) {
this.elements = this.toArray(o);
};
// public API -- prototype
Constr.prototype = {
constructor: MYAPP.utilities.Array,
version: "2.0",
toArray: function (obj) {
for (var i = 0, a = [], len = obj.length; i < len; i += 1) {
a[i] = obj[i];
}
return a;
}
};
// return the constructor
// to be assigned to the new namespace
return Constr;
}());
The way to use this new constructor will be like so:
var arr = new MYAPP.utilities.Array(obj);