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

args = [...] 

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

Идеальный результат obj.test.applyне бросает ошибку. Хотя я не могу найти способ распространения массива по вызову функции (aka Function::apply) без переопределения приемника (aka внутри obj.test).Функция :: применять не отменяя приемник

Разве это невозможно?

+0

'obj.test.apply OBJ, args' ...? –

+0

Какую ошибку он бросает? Является ли 'doSomething' привязанным к объекту, отличному от' obj'? Является ли 'doSomething' действительной функцией и свойством' obj' или его прототипом? – Phssthpok

ответ

1

Если вы действительно хотите использовать apply то просто сказать ему, что this должно быть:

obj.test.apply obj, args 

Но поскольку это CoffeeScript, вы можете скрыть все, что за splat:

obj.test(args...) 

Это будет obj.test.apply(obj, args) в версии JavaScript.

Например:

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

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

Вы также можете использовать восклицательный знак в определении функции, чтобы сделать его VARIADIC:

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

Демо: http://jsfiddle.net/ambiguous/1kgzc1kn/

+0

К сожалению, это все еще отменяет 'this', который в настоящее время привязан к функции. И это не тот объект, который держит его. Это частный объект. – aleclarson

+2

@aleclarson Это не очевидно из приведенного вами примера. –

+0

Ваш комментарий не имеет никакого отношения к вашему вопросу. Если вы скажете 'obj.test()', то 'this' будет' obj' внутри 'test'. Возможно, вы могли бы задать вопрос, на который хотите ответить. –

Смежные вопросы