2015-01-28 12 views
7

Sto migrando un progetto da CoffeeScript a ES6 (utilizzando 6to5 e Browserify) e sto correndo in una possibile limitazione o forse non conosco la sintassi corretta. In CoffeeScript ho potuto fare questo:ES6: Applicazione della funzione come metodo di classe

class SomeView extends BaseView 
    triggerMethod: Marionette.triggerMethod 

Come si esprime in classi ES6? Ho provato un paio di cose, ma genera errori Unexpected token, non importa quello che provo. Questo, per esempio:

let { triggerMethod } = Marionette; 

class SomeView extends BaseView { 
    triggerMethod, // doesn't work 
    triggerMethod: Marionette.triggerMethod // doesn't work 
} 

Ora mi può raggiungere questo impostando nel costruttore (this.triggerMethod = Marionette.triggerMethod), ma ci si sente un po 'brutto per me (solo una preferenza nella codifica stile suppongo). Qualsiasi aiuto sarebbe apprezzato.

risposta

12

Non è possibile dichiarare immobili a classi ES6, solo metodi e metodi statici (vedi here per la sintassi di dichiarazione di classe, prestare attenzione a ClassElement). Così uno dei seguenti esempi saranno sbagliato:

class A { 
    method1: B.someMethod // wrong! 
    method2: function() {} // wrong! 
    method3:() => {}  // wrong! 
} 

Sono disponibili diverse varianti per gestire il tuo problema:

  1. Uso getter:

    class SomeView extends BaseView { 
        get triggerMethod() { return Marionette.triggerMethod } 
    } 
    
  2. chiamata Marionette.triggerMethod da triggerMethod di SomeView classe:

  3. Aggiungere triggerMethod al prototipo di SomeView dopo la dichiarazione della classe:

    class SomeView extends BaseView { 
        //.. some class declaration 
    } 
    SomeView.prototype.triggerMethod = Marionette.triggerMethod; 
    

    o con Object.assign:

    class SomeView extends BaseView { 
        //.. some class declaration 
    } 
    
    Object.assign(SomeView.prototype, { 
        triggerMethod: Marionette.triggerMethod 
        // ... some another methods 
    }); 
    
  4. quello che già ha fatto - aggiunge Marionette.triggerMethod al this. Ma devi essere consapevole del fatto che in tal caso lo triggerMethod verrà mantenuto nell'oggetto stesso, non nel suo prototipo. Esempio:

    class SomeView extends BaseView { 
        constructor() { 
         this.triggerMethod = Marionette.triggerMethod 
         // ... 
        } 
    } 
    

Questo è tutto quello che puoi fare. Penso che la prima e la seconda variante siano le migliori scelte per il tuo caso, ma è una questione di gusti.

-1

Se ho ottenuto questo diritto è possibile definire i metodi della classe in questo modo:

class SomeView extends BaseView { 
    triggerMethod(){ 
     Marionette.triggerMethod; 
    } 
} 

Praticamente la stessa come in CoffeeScript, ma sono necessarie alcune parentesi graffe. Non ho provato questo, ma si veda http://wiki.ecmascript.org/doku.php?id=harmony:classes

+4

Il modo in cui lo hai definito, 'triggerMethod' in realtà non fa nulla. Fa riferimento a 'Marionette.triggerMethod', ma non lo esegue. –

Problemi correlati