2015-01-28 14 views
7

Przeprowadzam migrację projektu z CoffeeScript do ES6 (przy użyciu 6to5 i Browserify) i uruchamiam prawdopodobnie jakieś ograniczenie lub może po prostu nie znam właściwej składni. W CoffeeScript mogę to zrobić:ES6: Zastosowanie funkcji jako metody klasy

class SomeView extends BaseView 
    triggerMethod: Marionette.triggerMethod 

Jak wyrazić to na zajęciach ES6? Próbowałem kilku rzeczy, ale to powoduje błędy, niezależnie od tego, co próbuję. To na przykład:

let { triggerMethod } = Marionette; 

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

Teraz można to osiągnąć przez ustawienie go w konstruktorze (this.triggerMethod = Marionette.triggerMethod), ale czuje się trochę brzydki dla mnie (tak preferencję w stylu kodowania chyba). Każda pomoc będzie doceniona.

Odpowiedz

12

Nie można zadeklarować właściwości w klasach ES6, tylko metod i metod statycznych (patrz here dla składni deklaracji klasy, należy zwrócić uwagę na ClassElement). Tak więc każdy z poniższych przykładów będzie źle:

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

Masz kilka wariantów do obsługi problem:

  1. Zastosowanie Getter:

    class SomeView extends BaseView { 
        get triggerMethod() { return Marionette.triggerMethod } 
    } 
    
  2. połączeń Marionette.triggerMethod z triggerMethod z SomeView klasa:

  3. Dodaj triggerMethod do prototypu SomeView po deklaracji klasy:

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

    lub Object.assign:

    class SomeView extends BaseView { 
        //.. some class declaration 
    } 
    
    Object.assign(SomeView.prototype, { 
        triggerMethod: Marionette.triggerMethod 
        // ... some another methods 
    }); 
    
  4. co już nie - dodaje Marionette.triggerMethod do this. Ale musisz mieć świadomość, że w takim przypadku triggerMethod będzie przechowywany w samym obiekcie, a nie w jego prototypie. Przykład:

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

To wszystko można zrobić. Myślę, że pierwszy i drugi wariant to najlepszy wybór w twoim przypadku, ale to kwestia gustu.

-1

Jeśli mam z tego prawa można definiować metody klasy w ten sposób:

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

niemal tak samo jak w coffeescript, ale wymagane są pewne szelki. nie próbowałem tego, ale zobaczyć http://wiki.ecmascript.org/doku.php?id=harmony:classes

+4

Sposób, w jaki to zdefiniowałeś, "triggerMethod" tak naprawdę nic nie robi. Odwołuje się do 'Marionette.triggerMethod', ale nie wykonuje go. –

Powiązane problemy