使对象成为函数的最简单方法是现在和以后使用原型的方法



在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, bingfoo原型的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() {
  }
}
}();

最新更新