我正在使用看起来像这样的模式(伪示例):
var FOO = (function(foo) {
var foo = foo || {},
setThis = 'someValue';
//--------------------------------------------------------------------------
//
// Public methods:
//
//--------------------------------------------------------------------------
foo.init = function(bar) {
this.blah = [];
// Constructor stuff here...
};
foo.doSomething = function(bar) {
if (bar) {
this.doSomethingElse();
// Stuff here...
}
};
foo.doSomethingElse = function() {
// Stuff here...
};
//--------------------------------------------------------------------------
//
// Private methods:
//
//--------------------------------------------------------------------------
foo._imPrivate = function() {
// ... stuff here ...
this.blah = xyz; // References this.
};
foo._morePrivate = function(el) {
// No reference to this.
};
foo._otherPrivate = function(el) {
// No reference to this.
};
return foo; // Expose the methods.
}(FOO || {}));
像这样诽谤:
window.onload = function() { FOO.init(stuff); }
三个问题:
this
,我应该将它们作为“标准”函数(例如function _imPrivate() { ... }
)吗? 我问的原因:我有一些引用this
的方法,但我不想让他们公开访问;我也有一些不引用this
的“实用程序”方法......引用this
的方法可以是标准函数(在模块模式的上下文中)吗?setThis
变量实现setter的示例吗?答案 0 :(得分:3)
“私人”方法根本不是私有的,它们是公开的。 OP似乎没有利用使用立即调用的函数表达式(IIFE)提供的闭包。
函数this
的值由您调用函数的方式设置,它不是静态的(除非您使用ES5绑定)。它与“上下文”无关(至少不是在ECMA-262中使用上下文的方式,这是在javascript的上下文中应该如何使用这个词)。
如果你发布了一个你想要做的事情的真实例子,你可能会获得更多关于如何在其实现中利用模块模式的帮助。
答案 1 :(得分:2)
1
您可以执行_imPrivate.call(this, arg1, arg2,...);
在这种情况下,this
函数中的_imPrivate
将引用特定的实例。
2
var setThis = 'someValue';
foo.setter = function(value) {
setThis = value;
};