2015-03-09 17 views
8

Czytam poprzez informacje na Babel.js's documentation klasy ES6 i zauważył, że mówi, że obiekty mogą teraz mieć dynamiczne nazwy własności:Czy w klasie istnieje wiele nazw dynamicznych metod?

var obj = { 
    ... 

    // Computed (dynamic) property names 
    [ "prop_" + (() => 42)() ]: 42 
}; 

Wydaje się, że wskazane byłoby w klasach, jak również. Czy to możliwe, aby zrobić coś podobnego w klasie ES6 bez robią to w konstruktorze, czyli:

class Foo { 
    [ "read" + (...)(['format1', 'format2']) ] { 
    // my format reading function 
    } 
} 

zamiast robić coś takiego w konstruktorze:

class Foo { 
    constructor(opts) { 
    let formats = ['format1', 'format2']; 
    let self = this; 

    formats.forEach(function(format) { 
     self["read" + format] = function() { 
     // my format reading function 
     } 
    }) 
    } 
} 

Innymi słowy, chcę aby móc pobrać tablicę, na przykład ['format1', 'format2'] i utworzyć dwie metody, readformat1 i , w klasie dynamicznie, bez korzystania z konstruktora. czy to możliwe?

+0

"ale mam nadzieję, że to zrozumiałe" - to nie jest: -S – zerkms

+0

ahh zmieniłem go, aby użyć składni 'function' zamiast składni' => ', więc teraz powinien mieć więcej sensu. – josh

+0

Po prostu dodaj je dynamicznie do prototypu, jak zwykle. – Bergi

Odpowiedz

5

Tak, to jest możliwe, tylko brakowało wymaganego () do podpisu metoda:

class Foo { 
    [ "read" + ((format) => format)(myFormat) ]() { 
    // my format reading function   // ^--- this what missed 
    } 
} 

Babel repl: long and ugly url here

Od zaktualizowanym pytanie: nie jest to możliwe (przynajmniej ja nie zdaje sobie z tego sprawy). Możesz więc tworzyć metody o nazwach rozwiązanych w środowisku wykonawczym, ale nie możesz tworzyć N metod z tablicy przy użyciu tej składni.

+0

świetnie, dzięki! to trochę do bani, że '()' są wymagane, ale wygląda na czystsze niż sposób "konstruktora", który w przeciwnym razie byłby używany. – josh

+0

faktycznie, zrozumiałem po tym, jak przyjąłem, że to nie całkiem odpowiedzieć na moje pytanie. Chodziło mi o to, że chciałem dynamicznie przypisać nazwy metod podobne do tego, jak działa konstruktor na końcu pytania, w sposób skrótowy podobny do tego, na co odpowiedziałeś. zobacz moje zaktualizowane pytanie: – josh

+1

Obiekty @zerkms [Proxy] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Proxy) umożliwiłyby to. Potrzebują obsługi przeglądarki, ponieważ nie ma sposobu, aby polyfilować tę funkcję. – lyschoening

3

znalazłem na to pytanie w pierwszym linku Google, więc powinien dać kolejną użytecznej odpowiedzi :)

ES6 zajęć jest przede wszystkim po prostu cukier syntaktyczny, więc nadal można używać prototypów i zrobić coś podobnego

class Foo { ... } 

let formats = [ 'format1', 'format2' ]; 
formats.forEach(function(format) { 
    Foo.prototype['read' + format] = function() { ... } 
}); 

Nie znalazłem lepszego sposobu.

Powiązane problemy