2015-01-28 7 views
7

Ich migriere ein Projekt von CoffeeScript zu ES6 (mit 6to5 und Browserify), und möglicherweise läuft eine Einschränkung oder vielleicht ich einfach nicht die richtige Syntax kennen. In CoffeeScript konnte ich das tun:ES6: Anwenden von Funktion als Klassenmethode

class SomeView extends BaseView 
    triggerMethod: Marionette.triggerMethod 

Wie drücke ich dies in ES6-Klassen aus? Ich habe versucht, ein paar Dinge, aber es wirft Unexpected token Fehler, egal was ich versuche. Dieses zum Beispiel:

let { triggerMethod } = Marionette; 

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

Jetzt kann ich dies erreichen, indem es im Konstruktor (this.triggerMethod = Marionette.triggerMethod) einstellen, aber es fühlt sich ein bisschen hässlich zu mir (nur eine Präferenz in der Art Codierung I guess). Jede Hilfe wäre willkommen.

Antwort

12

Sie keine Eigenschaften in ES6 Klassen deklarieren, nur Methoden und statische Methoden (here für Syntax der Klassendeklaration sehen, achten Sie auf ClassElement). So eine der folgenden Beispiele wird falsch sein:

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

Sie haben mehrere Varianten, Ihr Problem zu umgehen:

  1. Verwendung Getter:

    class SomeView extends BaseView { 
        get triggerMethod() { return Marionette.triggerMethod } 
    } 
    
  2. Anruf Marionette.triggerMethod von triggerMethod von SomeView Klasse:

  3. hinzufügen triggerMethod zum Prototyp SomeView nach Klassendeklaration:

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

    oder mit Object.assign:

    class SomeView extends BaseView { 
        //.. some class declaration 
    } 
    
    Object.assign(SomeView.prototype, { 
        triggerMethod: Marionette.triggerMethod 
        // ... some another methods 
    }); 
    
  4. Was Sie schon haben - Marionette.triggerMethod zum this hinzuzufügen. Aber Sie müssen sich bewusst sein, dass in diesem Fall triggerMethod im Objekt selbst, nicht in seinem Prototyp gehalten wird. Beispiel:

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

Das ist alles, was Sie tun können. Ich denke, die erste und zweite Variante sind die beste Wahl für Ihren Fall, aber es ist Geschmackssache.

-1

Wenn ich dieses Recht haben Sie Klassenmethoden auf diese Weise definieren:

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

ziemlich das gleiche wie in Coffeescript, aber einige Klammern sind erforderlich. Ich habe nicht versucht, aber sehen http://wiki.ecmascript.org/doku.php?id=harmony:classes

+4

Wie Sie es definiert haben, tut 'triggerMethod' nicht wirklich etwas. Es verweist auf "Marionette.triggerMethod", führt es aber nicht aus. –