2015-03-09 6 views
8

lese ich durch die ES6 Klasse Informationen über Babel.js's documentation und bemerkte, dass er sagt, dass Objekte jetzt dynamische Eigenschaftsnamen haben:Ist es möglich, mehrere dynamische Methodennamen in einer Klasse zu haben?

var obj = { 
    ... 

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

Dies scheint, wie es auch in den Klassen nützlich sein würde. Ist es möglich, etwas ähnliches in einer ES6 Klasse zu tun, ohne es in einem Konstruktor zu tun, das heißt:

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

eher als so etwas wie dies im Konstruktor tun:

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

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

Mit anderen Worten, ich mag B. ['format1', 'format2'] nehmen und zwei Methoden, readformat1 und readformat2, in der Klasse dynamisch erstellen, ohne den Konstruktor zu verwenden. Ist das möglich?

+0

"aber hoffentlich ist es verständlich" --- es ist nicht: -S – zerkms

+0

ahh ich änderte es, um die Funktionssyntax anstatt der '=>' Syntax zu verwenden, also sollte es jetzt mehr Sinn machen. – josh

+0

Fügen Sie sie einfach wie immer dynamisch zum Prototyp hinzu. – Bergi

Antwort

5

Ja, es ist möglich, verpassten Sie nur die erforderliche () für die Methodensignatur:

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

Babel repl: long and ugly url here

Ab Ihre aktualisierte Frage: es ist nicht möglich (zumindest ich bin nicht bewusst). So können Sie Methoden mit in Runtime aufgelösten Namen erstellen, aber Sie können keine Methoden aus dem Array mit dieser Syntax erstellen.

+0

toll, danke! es ist irgendwie suck, dass die '()' erforderlich sind, aber es sieht sauberer als die "Konstruktor" Art, die sonst verwendet werden würde, denke ich. – josh

+0

tatsächlich, ich erkannte, nachdem ich es akzeptiert, dass dies nicht ganz meine Frage beantwortet. was ich meinte, war, dass ich Methodennamen dynamisch zuordnen wollte, ähnlich wie der Konstruktor am Ende der Frage, ähnlich wie bei der Antwort. Bitte sehen Sie meine aktualisierte Frage – josh

+1

@zerkms [Proxy] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Proxy) Objekte würde dies möglich machen. Sie benötigen jedoch Browser-Unterstützung, da es keine Möglichkeit gibt, diese Funktion zu füllen. – lyschoening

3

fand ich diese Frage in einem ersten Google-Link, so sollte eine weitere hilfreiche Antwort :)

ES6 Klassen ist meist nur ein syntaktischer Zucker geben, so können Sie immer noch Prototypen verwenden und so etwas wie

class Foo { ... } 

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

Ich habe keinen besseren Weg gefunden.