我是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
}
}
答案 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