我有以下代码定义单例:
var S = (function() {
this._enabled = false;
this.initialize = function() {
this._doit();
};
this._doit = function() {
this._enabled = true;
};
// Exporting
return {
Initialize: this.initialize
};
})();
我打电话:
S.Initialize();
得到这个:
'this._doit'不是函数
如果我只是在_doit()
中拨打initialize
,那就没问题......但我认为我确实设置了this
以便在我班级的各个元素中使用。
我做错了什么?感谢
答案 0 :(得分:2)
因为您正在返回一个包含Initialize的对象,该对象指向构造时this
的初始化函数,这可能是window
。
您想要执行以下操作:
var S = (function() {
return {
_enabled : false,
Initialize : function() {
this._doit();
},
_doit : function() {
this._enabled = true;
}
};
})();
S.Initialize();
这是一个非常非常不同的事情。
修改:如果您想让_doit()
真正保密,您可以写一下:
var S = (function() {
var s = {
_enabled : false,
initialize : function() {
_doit();
},
};
var _doit : function() {
s._enabled = true;
};
return s;
})();
s
成为您对象的公开面孔,而函数关闭其私有方。
答案 1 :(得分:2)
里面
this.initialize = function() {
this._doit();
};
this
是指initialize
个对象,所以你要做的是:
this.initialize._doit()
,不存在。
尝试将this
上下文保存到本地变量并使用该变量。
var S = (function() {
var _this = this;
this._enabled = false;
this.initialize = function() {
_this._doit();
};
this._doit = function() {
_this._enabled = true;
};
// Exporting
return {
Initialize: this.initialize
};
})();
答案 2 :(得分:1)
对于你在这里所做的事情,我会完全避免this
,例如:
var S = (function() {
var _enabled = false;
function initialize() {
_doit();
};
function _doit() {
_enabled = true;
};
// Exporting
return {
Initialize: initialize
};
})();
由于您未使用new
关键字,this
引用window
对象(或在严格模式下,它将引用undefined
)。另一种选择是使用new function()
,例如:
var S = new function() {
this._enabled = false;
this.initialize = function() {
this._doit();
};
this._doit = function() {
this._enabled = true;
};
};
S.initialize();