javascript绑定对象的原型函数

时间:2011-10-17 05:59:22

标签: javascript object underscore.js prototype-programming

如何将对象原型中的this指针绑定到对象的实例?

function Foo(){ }
Foo.prototype.f1 = function(){this.f2();} //is wrong because 'this' does not refer to Foo instance
Foo.prototype.f2 = function(){}

这真烦人。有人可以帮忙吗?我尝试在Foo的构造函数中做_.bindAll(this,'f1','f2'),但没有运气。

5 个答案:

答案 0 :(得分:1)

如果您使用var foo = new Foo();,您的代码将正常运行。然后,只需使用foo.f1();。 foo将在thisf1

原因是当您对构造函数使用new时,_proto链接将附加到将成为新实例的对象。此_proto_链接指向构造函数的原型。在运行时,如果实例的访问属性/方法不直接存在于实例上,则解释器将遵循_proto_,并尝试访问该属性/方法。

如果要调用具有this显式对象的函数,可以执行myFunc.call(myObjThatWillBeThis)

答案 1 :(得分:1)

您的代码应更改为:

function Foo() {
  this.f1 = function() {
    this.f2();
  }
  this.f2 = function() {
  }
}

答案 2 :(得分:1)

试试这个:

    var Foo = function() {};
    Foo.prototype.f1 = function() {this.f2();};
    Foo.prototype.f2 = function() {};
    var foo = new Foo();
    var proxyFn = function(fooInstance) {
        fooInstance.f1();
    };
    canvas.addListener('mousedown', proxyFn(foo), false);

或更通用的东西:

    var bindFunction = function(fnToBind, scopeObj) {
        return function() {  // closure scope will contain bindFunction args
            fnToBind.call(scopeObj);
        };
    };
    var Foo = function() {};
    Foo.prototype.f1 = function() {this.f2();};
    Foo.prototype.f2 = function() {};
    var foo = new Foo();
    var proxyFn = bindFunction(Foo.prototype.f1, foo);
    canvas.addListener('mousedown', proxyFn, false);

答案 3 :(得分:1)

这有效:

function Foo() {
    this.f1 = this.f1.bind(this);
    this.f2 = this.f2.bind(this);
}

Foo.prototype.f1 = function () { this.f2(); };
Foo.prototype.f2 = function () { console.log("f2"); };

var foo = new Foo();
var f = foo.f1;
f();

http://jsfiddle.net/VYdNx/3/

就像这样:

function Foo() {
    _.bindAll(this);
}

Foo.prototype.f1 = function () { this.f2(); };
Foo.prototype.f2 = function () { console.log("f2"); };

var foo = new Foo();
var f = foo.f1;
f();

http://jsfiddle.net/VYdNx/2/

答案 4 :(得分:1)

您在评论中提到您将f1设置为事件处理程序:

canvas.addListner('mousedown',this.f1, false)

相反,你可以传递一个闭包:

var self = this;
canvas.addListner('mousedown',function() {
    self.f1();
}, false);

或使用Underscore.js库的bind方法:

canvas.addListner('mousedown', _.bind(this.f1, this), false);