访问"私人"在范围外的匿名函数内的成员

时间:2014-10-22 07:36:13

标签: javascript

基本上我要做的是为匿名函数提供对“私有”函数/变量的访问。我需要一些关于我实现这一目标的方法的意见,以及可能更好地替代这些方法。 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);
    }
);

由于我将代码注入到函数中,因此“私有”作用域成员是自动可用的,因此我不需要对成员等进行任何复制,也不需要做很多工作。

这种方法存在根本问题吗?

您是否有更好的替代方案/方法来实现这一目标?

1 个答案:

答案 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);
});




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