2015-02-24 21 views
-1
obj = 
    test: -> this.doSomething() 

args = [...] 

try 
    obj.test.apply undefined, args 
catch e 
    console.error e 

理想的結果是obj.test.apply拋出一個錯誤。雖然我找不到任何方法來跨越函數調用(又名Function::apply)傳播數組而不覆蓋接收器(又名this,內部爲obj.test)。功能::適用不重寫接收機

這不可能嗎?

+0

'obj.test.apply OBJ, args' ...? – 2015-02-24 06:41:53

+0

它拋出了什麼錯誤? 'doSomething'是否與'obj'不同的對象綁定? doSomething是'obj'或其原型的有效函數和屬性嗎? – Phssthpok 2015-02-24 07:02:48

回答

1

如果你真的想用apply然後只需告訴它什麼this應該是:

obj.test.apply obj, args 

但由於這是CoffeeScript中,你可以隱藏一切背後splat

obj.test(args...) 

在JavaScript版本中變成obj.test.apply(obj, args)

例如:

args = [ 1 ] 
obj.test(args...) # same as obj.test(1) 

args = [ 1, 2 ] 
obj.test(args...) # same as obj.test(1, 2) 

您還可以使用在函數定義一個圖示,使其可變參數:

obj = 
    test: (args...) -> # do things with the `args` array 

演示:http://jsfiddle.net/ambiguous/1kgzc1kn/

+0

不幸的是,這仍然覆蓋了當前綁定到該函數的'this'。這不是持有它的對象。這是一個私人對象。 – aleclarson 2015-02-24 06:42:35

+2

@aleclarson從你給出的例子中不是很明顯。 – 2015-02-24 06:43:34

+0

你的評論與你的問題無關。如果你說'obj.test()',那麼'this'將會在'test'內部成爲'obj'。也許你可以問你想要回答的問題。 – 2015-02-24 18:53:49