2016-03-23 3 views
0

У меня есть некоторые проблемы с рамкой @ ключевого слова в анонимной функцииCoffeeScript объем @ ключевое слово в классе

(это не то, что происходит, но мне это нужно для моего примера)

createArray = (fun) -> fun() 

это пример класса

class Example 
    stuff: [] 
    otherStuff: createArray -> 
     @stuff 

в @ указывает на window (я полагаю). Поэтому я рассмотрел это и вспомнил fat arrow, чтобы создать функцию генератора.

Я попробовал этот

class Example 
    stuff: [] 
    otherStuff: createArray => 
     @stuff 

но это даже не компилируются в function(_this) { ...}(this). Поэтому я начал все обматывать в генераторах

class Example 
    stuff: [] 
    otherStuff: => 
     createArray -> 
      @stuff 

... 
    otherStuff: => 
     stuff = @stuff 
     createArray -> 
      stuff 
... 
    otherStuff: ((stuff) -> 
     createArray -> 
      stuff 
    )(@stuff) #this is the one that upsets me the most because it compiles to Example.stuff and not to Example.prototype.stuff 

, но ни один из них не работает.

Перед тем, как перейти на простой function вместо class, есть ли способ достичь того, что я хочу?

ответ

1
otherStuff: createArray -> 
    @stuff 

Это выполняется во время определения класса, а не при выполнении otherStuff(). В то время нет this (@), потому что объект еще не был создан. По существу, это делает:

Example.prototype.otherStuff = (function() { return this.stuff; })(); 
// which boils down to: 
Example.prototype.otherStuff = this.stuff; 

Очевидно, this не имеет ничего общего с экземпляром Example в этой точке.

Если вы хотите @ сослаться на текущий экземпляр Example, вам нужно отложить ваше выполнение функции до тех пор, пока есть экземпляр и вызвать otherStuff:

otherStuff: -> 
    createArray -> 
     @stuff 

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

otherStuff: -> 
    createArray => 
     @stuff 
+0

Я хочу, чтобы результат 'createArray' связанного с' @ otherStuff' во время создания класса, поэтому я пытался создать самостоятельно выполняя функцию. – fra9001

+1

Ну, во время создания класса, этого еще нет ... так ... это несколько невозможно. – deceze

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