Classes com CoffeScript
Autor: Ricardo Bocchi | Publicado: 2014-09-01T16:19:00-07:00

Salve galera,




Vou dar uma help de como criar uma classe javascript com costrutor, atributos e metodos usando coffeescript.



Para o exemplo, vamos criar uma classe Spinner. Vamos crar uma imagem de carregamento nesse site:&nbsp;



http://spiffygif.com/&nbsp;&nbsp;






No site selecione a opção PNG sprite, crie seu spinner e faça o download da imagem. Na documentação tem os exemplos de css e também um link para o&nbsp; javascript, que deve ser algo mais ou menos assim:



(function() {
    SpriteSpinner = function(el, options){
        var self = this,
            img = el.children[0];
        this.interval = options.interval || 10;
        this.diameter = options.diameter || img.width;
        this.count = 0;
        this.el = el;
        img.setAttribute("style", "position:absolute");
        el.style.width = this.diameter+"px";
        el.style.height = this.diameter+"px";        

        return this;
    };
    SpriteSpinner.prototype.start = function(){
        var self = this,
            count = 0,
            img = this.el.children[0];
        this.el.style.display = "";
        self.loop = setInterval(function(){
            if(count == 19){
                count = 0;
            }
            img.style.top = (-self.diameter*count)+"px";
            count++;
        }, this.interval);

        $(this.el).parent().css('display', 'block')
    };
    SpriteSpinner.prototype.stop = function(){
        clearInterval(this.loop);
        this.el.style.display = "none";
    };
    document.SpriteSpinner = SpriteSpinner;
})(); 



E com base nesse código vamos criar nossa elegante classe usando coffee:

    class SpriteSpinner

        constructor: (options) -&gt;            
            @el = $(options.el)[0]
            img = @el.children[0]
            @interval = options.interval || 10
            @diameter = options.diameter || img.width
            @count = 0            
            img.setAttribute "style", "position:absolute"
            @el.style.width = @diameter + "px";
            @el.style.height = @diameter + "px";       


        start: -&gt;                     
            count = 0
            self = @
            img = @el.children[0]   
            @el.style.display = ""
            @loop = setInterval (  -&gt;           
                count = 0 if  count == 19
                img.style.top = (-self.diameter * count) + "px"
                count++   
                return
            ), @interval

            $(@.el).parent().css 'display', 'block'
        
        stop: -&gt; 
            clearInterval @loop 
            @el.style.display = "none"   


Detalhes:



No constructor você pode definir os atributos da classe usando o&nbsp; @, que serão automágicamente criados na complicação para js.

Para usar 


    spinner = new SpriteSpinner {interval: 50, el: '#spinnerWrapper'}

    spinner.start()

    setInterval( -&gt;
       spinner.stop()
    , 10000)





Para mais detalhes sobre classes no coffe visite o site http://coffeescriptcookbook.com/chapters/classes_and_objects/class-methods-and-instance-methods


Até a próxima!