如何在模块中创建JavaScript对象构造函数?

如何在模块中创建JavaScript对象构造函数?,javascript,Javascript,我正在尝试创建一个可重用的javascript对象(我想使用new)。当我尝试新建一个自定义对象时,出现错误: “org.myorg.sadp.section.sadpSection不是构造函数” 出于名称空间的原因,我正在模块化我的JS。我想知道这是否是问题所在: if (!window.org) var org = { myorg: {} }; if (!org.myorg) org["myorg"] = { sadp: {} }; if (!org.myorg.sadp) org.

我正在尝试创建一个可重用的javascript对象(我想使用new)。当我尝试新建一个自定义对象时,出现错误:

“org.myorg.sadp.section.sadpSection不是构造函数”

出于名称空间的原因,我正在模块化我的JS。我想知道这是否是问题所在:

if (!window.org) var org = { myorg: {} };    
if (!org.myorg) org["myorg"] = { sadp: {} };
if (!org.myorg.sadp) org.myorg["sadp"] = {};

org.myorg.sadp.section = (function(ns) {
    if (ns.section) {
        return ns;
    }
    else {
        ns.section = {};
    }
    ns.section.sadpSection = function(name) {
        this.name = name;
        this.isCompleted = false;
        this.booleanQuestions = new Array();
        this.multipleChoiceQuestions = new Array();
        this.sliders = new Array();
        return true;
    }
    return ns;

} (org.myorg.sadp))
这将导致以下错误:

var myObj = new  org.myorg.sadp.section.sadpSection("test");
我做错了什么


谢谢

您基本上是在使
org.myorg.sadp.section
相等
org.myorg.sadp
。这不是您想要的,它基本上是无限递归:

org.myorg.sadp.section == org.myorg.sadp.section.section
无论您添加多少个
.section
s,情况都是如此。您可以将其更改为:

org.myorg.sadp.section = 
{
    sadpSection: function(name)
    {
        this.name = name;
        this.isCompleted = false;
        this.booleanQuestions = new Array();
        this.multipleChoiceQuestions = new Array();
        this.sliders = new Array();
    }
}
您可以添加:

if(!org.myorg.sadp.section.sadpSection)
以避免重新指定构造函数

这并没有减少模块化。返回true也是不必要的。

我最近写了一篇关于处理这种类型的模块系统的文章,您可能想签出它。您可以这样使用它:

ns('org.myorg.sadp.section');

org.myorg.sadp.section.load('sadpSection', function(name) {
    this.name = name;
    this.isCompleted = false;
    // always better to use array literals than constructor
    this.booleanQuestions = []; 
    this.multipleChoiceQuestions = [];
    this.sliders = [];
    return true;
});

但基本上,您要处理的问题是,您返回的是
ns
,而不是
部分

您的问题是:

org.myorg.sadp.section = (function(ns) {
应该是:

org.myorg.sadp = (function(ns) {

也就是说,从
org.myorg.sadp.section=(函数(ns)
行中删除
.section
,就可以设置了。