&引用;“朋友班”;在javascript中

&引用;“朋友班”;在javascript中,javascript,oop,friend-class,Javascript,Oop,Friend Class,我有一个创建小部件对象的工厂类。工厂对象需要在以后回调小部件对象的“私有方法”,以向其传递一些ajax信息。到目前为止,我提出的唯一实现是在小部件中创建一个公共方法,将私有方法返回给工厂,然后删除自身,工厂然后返回新的小部件,同时保留一个指向私有方法的指针。以下是一个简化的示例: function Factory() { var widgetCallback = null; this.ajaxOperation = function() { //some

我有一个创建小部件对象的工厂类。工厂对象需要在以后回调小部件对象的“私有方法”,以向其传递一些ajax信息。到目前为止,我提出的唯一实现是在小部件中创建一个公共方法,将私有方法返回给工厂,然后删除自身,工厂然后返回新的小部件,同时保留一个指向私有方法的指针。以下是一个简化的示例:

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;
        }
    }
}

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

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

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

我个人更喜欢JavaScript、Ruby等语言,它们对你的能力没有限制(即使我必须在工作中使用Java+GWT,呵呵),但你可以依靠自律来避免做愚蠢的事情。我宁愿在方法名前面加上“_”(并在不应该使用的地方避免使用它),也不愿尝试强制使用私有方法。由于JavaScript本质上是不受限制的,你可以做一些疯狂的事情,所以它需要很多规则

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

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];
}
只需让构造函数返回一个
元组

或者,只需使用闭包范围直接在
小部件中编辑
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是JavaScript,不是艾达或C++或java。你可以做语言允许你做的事情,但是你应该经常问自己,你是否只是为了复杂而把它复杂化。仅仅采用简单的解决方案并没有什么害处。这是一种脚本语言,不是一种军事工具。虽然我完全同意@entonio,但在这里,我没有看到任何陷阱。这段代码似乎很好用。@Mihsath编写这样的代码会导致后续问题。它可以工作,但不是推荐的样式请在private/internal方法前面加上
这是事实上的标准。是的,我现在记得你说过,我已经有一段时间没有真正编写纯JavaScript了……)@SteinGStrindhaug只有在滥用损坏的js引擎的情况下才能添加新方法。使用
\uuu
不是标准,应该加以劝阻。使用局部变量和闭包可以提供真正的隐私。