我经常需要将对象中的方法传递到其他对象中。然而,我通常希望该方法附加到原始对象上(通过附加,我指“this”应该指向原始对象)。我知道一些方法可以实现这个目的:
a) 在对象构造函数中:ObjectA = function() { var that = this; var method = function(a,b,c) { that.abc = a+b+c }}
b) 将对象B传递给对象A:objectB.assign(function(a,b,c) { that.method(a,b,c) })
c) 在两个对象之外:objectB.assign(function(a,b,c) { objectA.method(a,b,c) })
我想知道是否有更简单的方法来传递附加到原始对象的方法。
Function#bind
,它与ob1的createDelegate
具有相同的目的,但在几个月前经过了相当一轮的性能测试和优化:http://github.com/sstephenson/prototype/blob/master/src/lang/function.js#LC108 另外:我会使用scope || undefined
而不是scope || window
,以避免不必要的浏览器特定性和window
被覆盖的问题。使用undefined
作为范围调用apply
将使用全局对象。 - T.J. Crowderthis
值)调用实际目标函数。有时候更有效率的方法是使用闭包(其中你有var self = this
然后一个使用self.foo()
的函数来关闭它),其他时候使用像 ob1 的示例一样创建委托更有效率 - 对于相对较新的Javascript和/或不太了解闭包的人来说,后者更清晰易懂,这是有价值的。 - T.J. Crowdervar self = this;
,然后在闭包中使用self
即可。同样地,每当我定义一个接受回调的API时,我总是允许调用者指定上下文并在给定时使用它;这样做的API意味着你根本不需要创建委托。 - T.J. Crowdermethod(a, b, c, callback, context)
这样的东西,然后有一个默认上下文,比如this
吗? - peterjwest