我是面向对象JS的新手,我想知道是否有更好的方法来做到这一点:
this.aProperty = function(myCurrentInstance){ some code }(this);
我只是希望我的对象的属性获取函数返回的值,但是这个函数需要使用当前对象的其他属性,所以我必须给函数本身提供。
但是,有更好的方法吗?
答案 0 :(得分:1)
功能范围是OOJS中更棘手的问题之一!关键是要记住一个对象方法只是一个函数被指定为一个对象的属性,所以如果它没有被仔细调用(例如它作为一个回调传递给某些东西)那么它可以运行在错误的上下文中,正如您所发现的那样,错误的事物与this
绑定在一起。
请记住:
var someObj = {
someMethod: function() {
}
}
someObj.someMethod(); // in someMethod, this will be someObj
var someRef = someObj.someMethod;
someRef(); // the function will now run with this bound to the window object, which you probably don't want
如果必须传递引用,则可以绑定该函数。在现代浏览器中,您可以使用Function.prototype.bind
:
this.aProperty = (function() {}).bind(this);
较旧的浏览器需要填充。 jQuery有一个:
this.aProperty = $.proxy(function() { }, this);
或者你可以写自己的:
Function.prototype.bind = function(scope) {
var fn = this;
return function() {
fn.apply(scope, arguments);
}
}
然后像第一个示例一样使用.bind
语法。