javascript中的“朋友类”

Der*_*erg 5 javascript oop friend-class

我有一个创建 Widget 对象的 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来实现我所追求的效果,或者这是一种相当合理的方法?我知道它有效,只是想知道我是否步入了我应该注意的任何陷阱。

Ray*_*nos 1

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];
}
Run Code Online (Sandbox Code Playgroud)

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

另一种方法是使用闭包作用域widgetCallback直接在Widget构造函数中进行编辑

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)