如何将对象原型中的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'),但没有运气。
答案 0 :(得分:1)
如果您使用var foo = new Foo();
,您的代码将正常运行。然后,只需使用foo.f1();
。 foo将在this
中f1
。
原因是当您对构造函数使用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();
就像这样:
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();
答案 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);