"朋友班"在javascript中

"Friend Classes" in javascript

本文关键字:quot javascript 朋友      更新时间:2023-09-26

我有一个创建Widget对象的Factory类。Factory对象需要稍后回调Widget对象的"私有方法",以向其传递一些ajax信息。到目前为止,我想到的唯一实现是在Widget中创建一个公共方法,该方法将私有方法返回给工厂,然后删除自己,工厂然后返回新的Widget,同时保留一个指向私有方法的指针。下面是一个简化的例子:

function Factory()
{
    var widgetCallback = null;
    this.ajaxOperation = function()
    {
        //some ajax calls
        widgetCallback('ajaxresults');
    }
    this.getNewWidget = function()
    {
        var wid = new Widget();
        widgetCallback = wid.getCallback();
        return wid;
    }
    function Widget()
    {
        var state = 'no state';
        var self = this;
        var modifyState = function(newState)
        {
            state = newState;
        }
        this.getState = function()
        {
            return state;
        }
        this.getCallback = function()
        {
            delete self.getCallback;
            return modifyState;
        }
    }
}

有没有更好的方法来达到我想要的效果,或者这是一个相当合理的方法?我知道它是有效的,只是好奇我是否陷入了我应该意识到的陷阱。

this.getNewWidget = function() {
    var val = new Widget(),
        wid = val[0],
        widgetCallback = val[1];
    return wid;
}
function Widget() {
    var state = 'no state';
    var self = this;
    var modifyState = function(newState) {
        state = newState;
    }
    this.getState = function() {
        return state;
    }
    // Return tuple of Widget and callback
    return [this, modifyState];
}

只需让您的构造函数返回一个Tuple<Widget, function>

或者,只需使用闭包范围直接在Widget构造函数中编辑widgetCallback

function Factory() {
    var widgetCallback = null;
    this.ajaxOperation = function() {
        //some ajax calls
        widgetCallback('ajaxresults');
    }
    this.getNewWidget = function() {
        return new Widget();;
    }
    function Widget() {
        var state = 'no state';
        var self = this;
        // set it directly here!
        widgetCallback = function(newState) {
            state = newState;
        }
        this.getState = function() {
            return state;
        }
    }
}

我对面向对象的JavaScript不够熟悉(我在GWT代码中主要使用一到两行代码),无法给出真正的答案(但我发现我的回复有点长,需要注释…)

我认为自我修改类,听起来像是gotcha的一个主要潜力。

我个人更喜欢JavaScript、Ruby等语言,它们对你能做的事情没有限制(即使我在工作中必须使用Java+GWT,呵呵),但你可以依靠自律来不做愚蠢的事情。我宁愿在方法名称前面加上"_"(并简单地避免在不应该使用的地方使用它),也不愿尝试强制使用私有方法。由于JavaScript本质上不受你可能做的疯狂事情的限制,所以它无论如何都需要大量的纪律。

如果您在使用后删除了一个方法;为了保护它,你能不能简单地添加一种新的方法来做同样的事情?无论如何,你仍然会依靠你(和其他人)的自律和理智,不是吗?