在JavaScript中,如果我有:
var foo = function(){}
foo.prototype.bar = function() {
console.log(this);
}
baz = new foo();
baz.name = 'baz';
bing = new foo();
bing.name = 'bing';
baz.bar();
bing.bar();
setTimeout(baz.bar);
setTimeout(bing.bar);在我的控制台中,我看到baz、bing、window、window对象按照这个顺序被记录。
什么是最简单的,或“正常”的把戏,需要看到:
baz、bing、baz、bing在foo原型的bar函数中使用"this-like“变量进行记录
当我说“类似于这个”时,我指的是一个变量,我可以在bar()中使用它来访问对象,它既是现在的方法,也是以后的方法。
编辑:
进一步澄清,当我调用bar()时,我想避免知道它想要使用this,因此我需要做一些类似bind()的事情。假设当我在baz或bing上调用bar()时,它是一个“黑盒”。我想调用bar()作为bing或baz的方法,而不知道它是如何工作的,并且我想让bar()的内部知道它是哪个对象的方法。
发布于 2013-06-13 23:01:09
如果您不喜欢使用bind(),一种策略是在构造时将您的“绑定”方法附加到对象,“间接”引用this。
这一点:
var foo = function(){
var _this = this;
this.bar = function() {
console.log(_this);
}
}
baz = new foo();
baz.name = 'baz';
bing = new foo();
bing.name = 'bing';
baz.bar();
bing.bar();
setTimeout(baz.bar);
setTimeout(bing.bar);日志:
baz
bing
baz
bing但一般来说,我喜欢在可能的情况下使用this,这样如果需要的话,我可以将我的方法apply()到其他对象。我只是将我的“延迟调用”封装在匿名函数中,假设它们使用this
setTimeout(function() { baz.bar(); });
setTimeout(function() { bing.bar(); });发布于 2013-06-13 22:47:34
使用bind (尽管您可能需要在较旧的浏览器中填充它):
setTimeout(baz.bar.bind(baz));
setTimeout(bing.bar.bind(bing));
// btw,
// baz.bar.bind(bing)
// foo.prototype.bar.bind(bing)
// would have the same result发布于 2014-11-24 21:16:35
这些天我经常做这样的事情是为了方便,没有花招,只是为了扩大范围:
function () {
function _this() {
return window.myObject;
}
window.myObject = {
myMethod: function myMethod() {
_this().myOtherMethod();
},
myOtherMethod: function myOtherMethod() {
}
}
}();https://stackoverflow.com/questions/17089895
复制相似问题