创建命名空间Javascript单例类的对象

时间:2016-03-13 19:39:44

标签: javascript javascript-objects javascript-namespaces

我是IIFE的新手并尝试在Siungleton JavaScript类中使用JavaScript实现名称空间:

我有一个JavaScript类(比如main类):

var myIIFE = (function () {
    var x = null;

    //constructor function
    var myIIFE = function() {
        var a = new IIFE.InsideIIFE();  //says not a constructor
    }

    myIIFE.prototype = {
        //some methods
    }

   function createIstance() {
        return new myIIFE();
   }

    return {
       getInstance: function() {
           if (!this.instance) {
                this.instance = createInstance();
           }
           return this.instance;
       }
    };
})();

然后我有另一个JavaScript命名空间类:

myIIFE.InsideIIFE = (function() {
     var inside = function() {}
     inside.prototype = { //some methods }
     return inside;
});

我想在myIIFE.InsideIIFE中创建一个myIIFE的对象,这给我一个错误:

myIIFE.InsideIIFE is not a constructor

我做错了吗?或者,如果这是一个正确的方法,那么我应该做出哪些改变。

我尝试使用new this.InsideIIFE()InsideIIFE,但没有使用它们。

编辑:

根据我的分析,我理解myIIFE(父级)是一个对象,因为它返回一个对象:

 return {
     getInstance: function() {
          //method body
     }
 }

1 个答案:

答案 0 :(得分:0)

此代码存在许多问题,让我们从头开始尝试运行它:

var myIIFE = (function () {
 ....
})();

这导致myIIFE成为一个对象,确切地说,这个对象:

{
   getInstance: function() {
       if (!this.instance) {
            this.instance = createInstance();
       }
       return this.instance;
   }
}

所以,我假设你做了

myIIFE.getInstance()

试图返回new myIIFE();

它会遇到myIIFE()并尝试执行此操作:

new IIFE.InsideIIFE();

我认为你打算写

new myIIFE.InsideIIFE();

因为IIFE未在您提供的代码中的任何位置定义。

让我们看看myIIFE.insideIIFE

是什么
var myIIFE.InsideIIFE = (function() {
     var inside = function() {}
     inside.prototype = { //some methods }
     return inside;
});

首先,您从var开始,这是错误的,因为myIIFE已经定义,您只是在向其中添加新属性。所以它应该只是

myIIFE.InsideIIFE = (function() {
     var inside = function() {}
     inside.prototype = { //some methods }
     return inside;
});

它应该有用。

一般情况下,您的代码似乎就像您没有掌握整个"构造函数"概念非常好。我建议你看一下以下链接,他们应该帮忙。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript