4

在 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内部的“this-like”变量记录barfoo

当我说“this-like”时,我的意思是一个变量,我可以在其中使用bar()它来访问对象,它是现在和以后的方法。

编辑:

进一步澄清,我想避免需要知道我何时调用 bar() 它将要使用this,因此我需要做类似bind(). 假设当我调用bar()baz 或 bing 时,它是一个“黑匣子”。我想在不知道它是如何工作的情况下将 bar() 称为 bing 或 baz 的方法,并且我希望 bar() 的内部知道它是什么对象的方法。

4

3 回答 3

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
于 2013-06-13T14:47:34.367 回答
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(); });
于 2013-06-13T15:01:09.017 回答
0

这些天我为了方便而做了很多这种事情,没有诡计,只是范围:

function () {

function _this() {
  return window.myObject;
}

window.myObject = {
  myMethod: function myMethod() {
    _this().myOtherMethod();
  },

  myOtherMethod: function myOtherMethod() {

  }
}

}();
于 2014-11-24T13:16:35.193 回答