在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"变量进行记录?
当我说"this-like"时,我的意思是,我可以在bar()
中使用一个变量来访问对象,它现在和以后都是一个方法。
进一步澄清,我想避免需要知道当我调用bar()时,它会想要使用this
,因此我需要做一些类似bind()
的事情。假设当我在baz或bing上调用bar()
时,它是一个"黑匣子"。我想调用bar()作为bing或baz的方法,而不知道它是如何工作的,我希望bar()的内部知道它是哪个对象的方法。
如果您不喜欢使用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(); });
使用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
这些天我做了很多这样的事情为了方便,没有诡计,只是范围:
function () {
function _this() {
return window.myObject;
}
window.myObject = {
myMethod: function myMethod() {
_this().myOtherMethod();
},
myOtherMethod: function myOtherMethod() {
}
}
}();