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

Create object of namespace Javascript singleton class

本文关键字:对象 单例类 Javascript 命名空间 创建      更新时间:2023-09-26

我是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 中创建一个myIIFE.InsideIIFE的对象,这给我抛出了一个错误:

myIIFE.InsideIIFE is not a constructor

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

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


编辑:

从我的分析中,我了解到myIIFE(父级)是一个对象,因为它在以下位置返回一个对象:

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

这段代码有很多问题,让我们从一开始就尝试在脑海中运行它:

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