基本上我要做的是为匿名函数提供对“私有”函数/变量的访问。我需要一些关于我实现这一目标的方法的意见,以及可能更好地替代这些方法。 Fiddle
观察以下摘录。
function Something()
{
/*private*/ var _someVariable = 1;
/*private*/ function _someFunction() {
alert('_someFunction');
}
/*public*/this.SomeDelegate1 = function(codeblock) {
var members = $.extend({
_someVariable : _someVariable,
_someFunction:_someFunction
}, this);
codeblock.apply(members);
}
/*public*/this.SomeDelegate2 = function(codeblock) {
var caller = eval('(' + codeblock + ')');
caller.apply(this);
}
}
在SomeDelegate1中,我将我的私有成员转换为实例成员并将其作为上下文传递给 匿名函数如下所示。
var someInstance = new Something();
someInstance.SomeDelegate1(
function() {
this._someFunction();
alert(this._someVariable);
}
);
我喜欢这样一个事实:人们可以指定您想要公开的成员,但它可能会变得非常笨重,例如:当您需要更新“私人”变量时,例如。
我显然可以将所有成员都写为实例成员,但我宁愿让它们保持“私有”,只允许在回调函数范围内进行访问。
在SomeDelegate2中,我使用了一个eval(是的,我知道与此相关的所有邪恶和巫术)。
var someInstance = new Something();
someInstance.SomeDelegate2(
function() {
_someFunction();
alert(_someVariable);
}
);
由于我将代码注入到函数中,因此“私有”作用域成员是自动可用的,因此我不需要对成员等进行任何复制,也不需要做很多工作。
这种方法存在根本问题吗?
您是否有更好的替代方案/方法来实现这一目标?
答案 0 :(得分:1)
正如我在评论中所说,我会公开所有内容并加上前缀"私人"带有下划线的属性名称。这就是我重构代码的方式:
function defclass(prototype) {
var constructor = prototype.constructor;
constructor.prototype = prototype;
return constructor;
}
var Something = defclass({
constructor: function () {
this._someVariable = 1;
},
_someFunction: function () {
alert("someFunction");
},
someDelegate1: function (f) {
f.apply(this);
},
someDelegate2: function (f) {
f.call(this, this._someVariable, this._someFunction);
}
});
var someInstance = new Something;
someInstance.someDelegate1(function () {
this._someFunction();
alert(this._someVariable);
});
someInstance.someDelegate2(function (someVariable, someFunction) {
someFunction();
alert(someVariable);
});

然而,这只是我的意见。我真的没有看到私有变量的意义。即使有人与你的私人变量混淆,也是他们的问题而不是你的问题。它会打破他们的代码,而不是你的代码。