Создать объект пространства имен Javascript синглтон-класса

Я новичок в IIFE и пытаюсь реализовать пространство имен в JavaScript для класса JavaScript Siungleton:

У меня есть класс 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 ответ

Решение

Есть много проблем с этим кодом, давайте попробуем запустить его в наших головах с самого начала:

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

Другие вопросы по тегам