JavaScript命名空间未捕获类型错误

时间:2011-09-12 10:19:16

标签: javascript object namespaces closures global

我一直在尝试通过为我的代码创建一个命名空间来更好地使我的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();

编辑:另外,我应该在命名空间定义之前或之后放置我的文档就绪函数。

1 个答案:

答案 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);