4

我们有一个 JS 框架,可以让我们设置“模块”。通过调用 addModule 方法并传递包含有关模块的必需属性以及可选方法的文字对象来添加每个模块。例子:

framework.addModule({

    id: "test-module",
    init: function () {
        //stuff to do when initializing like set up jQuery bindings

        $("div").click(function () {
            // need access to literal object so I can call:
            something.utility1();
        });

    },

    utility1: function () {
        something.utility2();
    },

    utility2: function () {
      // need access to literal object so I can call:
    }

});

我试图找出使对象本身可用于对象内部任何级别的任何代码(代替“某物”)的最简单方法。

我能做的最好的事情是向this: this对象添加一个属性,然后在我可以 put 的方法中添加var module = this,这可行,但需要将该变量添加到每个模块中。我想看看是否有另一种不需要向每个方法添加变量的方法。谢谢。

感谢您的评论,并且,zzzzBov,感谢您的建议。

但是,看起来下面的代码最适合我的需要。我团队的开发人员正在编写很多这些模块,我需要让他们清楚地了解解决方案。不得不打电话$.proxy可能会让事情变得不太清楚。我希望避免必须var module = this输入每种方法,这样会更干净,但似乎没有它是不可能的。

framework.addModule({
    id: "test-module",
    init: function () {
        var module = this;    
        $("div").click(function () {            
            module.utility1();
        });
    },

    utility1: function () {
        var module = this;
        module.utility2();
    },

    utility2: function () {        
    }
});

如果有人有更清洁的解决方案,请告诉我。

4

1 回答 1

0

jQuery 有一个proxy方法可以将函数绑定到特定的上下文。这会将您的事件绑定变成:

$('div').click($.proxy(this, 'utility1'));

或者,您可以实例化一个匿名函数,而不是使用对象文字来实例化模块对象:

framework.addModule(new function () {
    this.id = 'test-module';
    this.init = function () {
        $('div').click($.proxy(this, 'utility1'));
    };
    this.utility1 = function () {
        ...more code...
    };
    this.utility2 = this.utility1;
});
于 2013-05-01T17:25:40.603 回答