创建命名空间对象 Javascript 单例 class

Create object of namespace Javascript singleton class

我是 IIFE 的新手,正在尝试在 Siungleton JavaScript 中实现命名空间 JavaScript class:

我有一个JavaScriptclass(比如说mainclass):

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 命名空间 class:

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

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

myIIFE.InsideIIFE is not a constructor

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

我尝试使用 new this.InsideIIFE()InsideIIFE,但没有一个有效。


编辑:

根据我的分析,我了解到 myIIFE(父级)是一个对象,因为它 return 是位于:

的对象
 return {
     getInstance: function() {
          //method body
     }
 }

这段代码有很多问题,让我们试着运行从头开始:

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

这导致myIIFE是一个对象,准确的说是这个对象:

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

那么,我假设,你会

myIIFE.getInstance()

它试图 return 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;
});

它应该可以工作。

总的来说,从您的代码看来,您似乎没有很好地掌握整个 "constructor function" 概念。我建议您查看以下链接,它们应该有所帮助。

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