如何通过调用method.call(otherObject)来覆盖它?

时间:2011-01-14 20:51:32

标签: javascript

    var A = function(x){
        var that = this;
        this.a = x;

    }

    A.prototype = {
            init: function(){
                alert(this.a); // as that is not found :s
            }
    };

    var a = new A(1);
    var b = new A(2)
    a.init.call(b);
    // I want to alert number 1, how to do it?

我需要这个,因为我使用jQuery事件。


我生病的解决方案......不太好

我的问题得到了解答,但这有一些问题,我必须定义一个本地的var并为每个事件创建一个闭包......生病了!

        var that = this;
        this.view.skinAppliedSignal.add(function(){
            that.onSkinApplied();
        });

//然后在onSkinApplied中这是正确的。什么方式不那么hacky完成这个?

2 个答案:

答案 0 :(得分:2)

一般来说,你不能这样做。函数运行时唯一存在的this是调用建立的this

当你建立事件处理程序时,你可以在一个闭包中“陷阱”:

function something() {
  $('.whatever').each(function() {
    var whatever = $(this);
    whatever.find('button').click(function() {
      whatever.hide();
    });
  });
}

在该示例中,“whatever”用于从“each”循环中保存元素,以便连接到按钮元素的事件处理程序可以访问它。

编辑 - 基于评论和对问题的更新,很明显可能需要的是像“.bind()”这样的功能,它是ES5的一部分(由提供者提供)一些库,如Prototype,Functional和jQuery)。通过使用“bind”,您基本上可以在另一个函数中包含您选择的任何函数,这样您的函数将始终在this设置为某个特定对象的情况下调用。

答案 1 :(得分:1)

无法使用原型。你可以这样做,但是:

var A = function(x){
    var that = this;
    this.a = x;
    this.init = function(){
      alert(that.a);
    }
}

var a = new A(1);
var b = new A(2)
a.init.call(b);​