Javascript 需要一条关于OOJS的建议吗

Javascript 需要一条关于OOJS的建议吗,javascript,jquery,oop,Javascript,Jquery,Oop,我对面向对象JS非常陌生,我想知道是否有更好的方法来实现这一点: this.aProperty = function(myCurrentInstance){ some code }(this); 我只想让我的对象的一个属性得到一个函数返回的值,但是这个函数需要使用当前对象的其他属性,所以我必须给函数一个对象本身 但是,有更好的方法吗?函数作用域是OOJS中比较棘手的问题之一!关键是要记住,对象方法只是一个作为对象属性分配的函数,因此,如果没有仔细调用它(例如,它作为某个对象的回调传递),那么它

我对面向对象JS非常陌生,我想知道是否有更好的方法来实现这一点:

this.aProperty = function(myCurrentInstance){ some code }(this);
我只想让我的对象的一个属性得到一个函数返回的值,但是这个函数需要使用当前对象的其他属性,所以我必须给函数一个对象本身


但是,有更好的方法吗?

函数作用域是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
语法。

如果函数修改并使用了对象,为什么它不是这个对象的方法?基本上,这个属性永远不会改变,所以它只能是一次调用,这就是为什么我不想让一个特定的函数来做这件事,而是使用一个匿名函数。如果只发生一次,您可以使用
.call
.apply
强制作用域。因此,如果在创建对象时调用,您可以直接在构造函数中添加代码。如果您想稍后调用该函数,使用
call
可能是最好的解决方案。