Создать объект пространства имен 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