将范围绑定到函数调用之外的函数

时间:2015-05-03 00:50:51

标签: javascript jquery oop

一个例子:

var MyClass = (function () {
    function MyClass() {
        // construct
    }

    MyClass.prototype.clickEvent = function() {
        this.doSomething();
    };

    MyClass.prototype.doSomething = function() {
        // do something here
    };

    return MyClass;
})();

var mc = new MyClass();
$('my-ele').click(mc.clickEvent.bind(mc));

我需要将mc绑定到mc.clickEvent才能使其正常工作。还有另一种方法吗?它运行正常,如果有一种方法可以定义clickEvent()函数的范围而不需要在设置click事件函数时附加.bind(mc),那就太好了。

我看到这样的事情:

MyClass.prototype.clickEvent = function() {
    this.doSomething();
}.bind(this);

但这没效果。

2 个答案:

答案 0 :(得分:0)

如果您直接使用mc.clickEvent,它会按预期工作。 click实际上正在改变绑定,并且明确地调用bind,就像你不是在告诉它一样。

您也可以从一开始就模仿它。 (这就是Moogs answer所做的。

可能接近的一种更简单的方法是将呼叫包裹起来:

$('my-ele').click(function(i,e) { mc.clickEvent(i,e); })

clickEvent this内的这种方式仍为mc

答案 1 :(得分:0)

您的上一个代码段不起作用,因为您在调用bind方法之前没有包装该函数,如下所示:

function MyClass() {
    this.clickEvent = (function() {
        this.doSomething();
    }).bind(this);
}

然而,这是效率低下的因为它需要在不利用原型链的构造函数内定义函数。我觉得这有助于解释为什么你的最后一段代码没有用。