在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
在{{1}原型bar
函数内使用“this-like”变量记录}}?
当我说“像这样”时,我的意思是,我可以在foo
内使用一个变量来访问该对象,它现在和以后都是一种方法。
编辑:
进一步澄清,我想避免在我调用bar()时需要知道它将要使用bar()
,因此我需要做this
之类的事情。假设当我在baz或bing上调用bind()
时,它就是一个“黑匣子”。我想调用bar()作为bing或baz的方法而不知道它是如何工作的,我希望bar()的内部知道它是一个方法的对象。
答案 0 :(得分:1)
使用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
答案 1 :(得分:1)
如果您不想使用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(); });
答案 2 :(得分:0)
这些天我为了方便而做了很多这样的事情,没有诡计,只是范围:
function () {
function _this() {
return window.myObject;
}
window.myObject = {
myMethod: function myMethod() {
_this().myOtherMethod();
},
myOtherMethod: function myOtherMethod() {
}
}
}();