2015-03-09 14 views
8

che sto leggendo le informazioni sulla classe ES6 su Babel.js's documentation e ho notato che si dice che gli oggetti possono ora avere i nomi delle proprietà dinamiche:È possibile avere più nomi di metodi dinamici in una classe?

var obj = { 
    ... 

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

Questo sembra che sarebbe utile nelle classi pure. E 'possibile fare qualcosa di simile a una classe ES6 senza farlo in un costruttore, vale a dire:

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

piuttosto che fare qualcosa di simile nel costruttore:

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

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

In altre parole, voglio essere in grado di prendere alcuni array, come ['format1', 'format2'] e creare due metodi, readformat1 e readformat2, nella classe in modo dinamico, senza utilizzare il costruttore. È possibile?

+0

"ma si spera che sia comprensibile" --- non lo è: -S – zerkms

+0

ahh l'ho modificato per usare la sintassi 'function' piuttosto che la sintassi' => ', quindi dovrebbe avere più senso ora. – josh

+0

Basta aggiungerli dinamicamente al prototipo come sempre. – Bergi

risposta

5

Sì, è possibile, ti sei perso solo la necessaria () per il metodo di firma:

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

Babel repl: long and ugly url here

quanto della tua domanda aggiornato: non è possibile (almeno io sono non ne sono consapevole). Quindi è possibile creare metodi con nomi risolti in runtime, ma non è possibile creare metodi N dall'array usando quella sintassi.

+0

fantastico, grazie! è un po 'schifoso che '()' sia richiesto ma sembra più pulito del modo 'costruttore' che sarebbe altrimenti usato, penso. – josh

+0

in realtà, ho capito dopo aver accettato che questo non ha risposto alla mia domanda. quello che volevo dire era che volevo assegnare dinamicamente nomi di metodi simili al modo in cui il costruttore alla fine della domanda funziona, in modo abbreviato simile a quello a cui hai risposto come. per favore vedi la mia domanda aggiornata – josh

+1

@zerkms [Proxy] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Proxy) renderebbe questo possibile ciò possibile. Hanno bisogno del supporto del browser anche se non c'è modo di aggiungere polilinee a questa funzione. – lyschoening

3

Ho trovato questa domanda in un primo collegamento di Google, in modo da dovrebbe dare un'altra risposta utile :)

ES6 classi è per lo più solo uno zucchero sintattico, quindi è ancora possibile utilizzare prototipi e fare qualcosa di simile

class Foo { ... } 

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

Non ho trovato un modo migliore.

Problemi correlati