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

时间:2013-06-13 14:38:40

标签: javascript prototype this

在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);

在我的控制台中,我看到按顺序记录了bazbingwindowwindow个对象。

要看到的最简单或“正常”的诡计是什么:

bazbingbazbing在{{1}原型bar函数内使用“this-like”变量记录}}?

当我说“像这样”时,我的意思是,我可以在foo内使用一个变量来访问该对象,它现在和以后都是一种方法。

编辑:

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

3 个答案:

答案 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() {

  }
}

}();