ES6 Dynamischen Klassennamen
Ich habe experimentiert mit ES6-Klassen und Frage mich, wenn Sie ändern, können Klassennamen dynamisch? Zum Beispiel
class [Some dynamic name] {};
- Warum willst du einen dynamischen Namen für eine Klasse? Was würde der Punkt sein?
- Ich Baue Modelle, die ich will nicht zu hart code, dem class-Schlüsselwort legt die "das.Konstruktor.name" - Eigenschaft, die unveränderlich ist. Wenn ich könnte, erstellen Sie dynamisch, es wird diese Eigenschaft festgelegt ist richtig für mich. Die Verwendung von eval, scheint nicht den richtigen Tipp an alle.
- Das sagt alles, wirklich. Die Instanz sollte dynamisch sein, nicht deine Klasse Vorlage, aber wenn du überzeugt bist das ist der richtige Ansatz, können Sie einfach erstellen Sie eine standard-Funktion mit der
Function
Konstruktor und der Prototyp als hätten Sie in ES5. Oder verwenden Sie einen task laufen wie Gulp/Grunt zum generieren der Klassen pre-build constructor.name
ist nicht unveränderlich.- Sie werden auch wollen einen Blick auf Ist es nicht-eval Weg, um erstellen Sie eine Funktion mit einem Laufzeit-bestimmt-name? (die Werke für
class
es genauso gut) - Wenn mit 5 Klassen, dann
let tmp = { [name](){} };
und den Zugriff auf benannte Funktiono[name]
. Wäre cool, wenn wir das tun könnten, die mit den Klassen:let o = { class [name] {} }
. - Es ist nur Lesen.
- konfigurierbar ist. Sie können ihn überschreiben, wenn Sie möchten.
- Kann man dann erläutern, wie es zu tun mit einer Klasse?
- Nur
Object.defineProperty(constructor, "name", {value:…})
. Sie können auch hinzufügen einerstatic name() { … }
- Methode oder die get auf die Klasse selbst. - Ein Anwendungsfall ist, Dinge zu schaffen, die wrap/von anderen Klassen abgeleitet werden, wie ein höherer Bestellung von Komponenten. Es ist viel mehr nützlich, um die zugrunde liegende Klasse name (oder eine Variante davon) ausgesetzt als die Sache, die ihn geändert.
- Ich kam hierher auf der Suche nach etwas (lese-dynamic-Klasse-Erstellung), aber Ihren Kommentar "verwenden eines task läuft wie Gulp/Grunt zum generieren der Klassen" schickt mich auf eine andere Richtung, das löst eine Menge Probleme, die ich gar nicht gedacht aus. Danke ......
- Das sagt alles, wirklich. Die Instanz sollte dynamisch sein, nicht deine Klasse Vorlage. Ich sehr einverstanden. Aus Java, das ist sehr statisch, ich Schätze JS dynamisch jeden Tag mehr. Ich möchte um einen Klassennamen dynamisch, so dass meine Klasse nicht mehr anonym sein. Und ich möchte Klassen dynamisch bin, weil ich arbeite auf eine Bibliothek erstellen und verwenden von Mixins in Verbindung zu erreichen Mehrfachvererbung mit ES6-Klassen. Je länger ich über die klassische Vererbung, die mehr ich haben immer davon überzeugt, dass mit einfacher Vererbung nicht schneiden Sie es. JS ist fantastischen, weil es ist dynamisch, nicht trotz es.
- Gut gesagt. Ich landete hier, weil ich versuche, das gleiche zu tun. Ich habe experimentiert mit class factory Mixins in Verbindung, und auch ein tool wie
class Foo extends multiple(One, Two, Three) {...}
verbindet die Klassen zusammen mit Proxy. Der wirkliche Grund ist, ich möchte dynamische Klasse Benennung ist, weil ich dann eine user-Klasse-Skillung und erzeugen einer Klasse, basierend auf einem bestimmten Namen, und APIs wieClass('Foo').extends(One, Two, { ... }) which automatically generates a class that duals as class and class-factory mixin. We could also transpile normal
class Foo extends (Eins, Zwei, Drei) {}` - Etc. Es gibt zu viele Dinge, die wir tun könnten, mit dynamischen features (aber wenn nur super waren und dynamischen statt statischen).
- Bitte beachten Sie auch meine Bibliothek, Mikrofone und lassen Sie mich wissen, ob es für Ihre Zwecke geeignet sind.
- Wir suchen weitere Mitarbeiter und es wäre toll, wenn könnten wir erfinden ein großes Rad zusammen 🙂
- Geantwortet, in dem GitHub-repo. 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es gibt vermutlich eine bessere Lösung für was auch immer Sie versuchen zu erreichen, aber Sie können zuweisen einer Klasse Ausdruck auf ein Objekt:
Diese nicht wirklich ändern in ES2015: wenn Sie möchten, erstellen Sie eine dynamisch benannt binden, müssen Sie ein Objekt verwenden, oder eine andere Zuordnung statt.
.name
ist jetztsomeName
.{[someName]: class {…}}
class
Wert natürlich).var Foo = class {}
. In Chrom, die Klasse nicht benannt. 🙁class Foo {}
sowieso.let Foo; Foo = class {};
? Sollte das auch funktionieren? Oder muss es während der Erklärung?class base {}; var classes = {}; classes.test = class extends base{}; classes.test.name
zurückkehren sollte, 'test', aber es gibt 'Basis'name
von der Funktion ist nicht von Bedeutung in dieser Antwort, nur wie finden Sie es, im code. Ich habe nie behauptet, dass dasname
Immobilie hat einen bestimmten Wert.Object.defineProperty(C, 'name', ...)
arbeitet, währendC.name = ...
wirftScript Error: "name" is read-only
(zumindest in Firefox).Object.defineProperty()
soll ermöglichen die Modifikation von nur-lese-Eigenschaften, oder ist das nur eine Implementierung Eigenart, das ist eigentlich nicht dort zu sein?Gibt es eine ziemlich einfache Möglichkeit, es zu tun:
Hier's die demo.
Es verwendet ein Objekt-literal definieren Sie ein Feld mit dem gewünschten Namen, halten würde, eine neue Klasse. Dies bewirkt, dass die neue Klasse automatisch erhalten Sie den gewünschten Namen ein. Nachdem wir fertig sind mit, dass, wir extrahieren Sie eine neue Klasse und gibt es zurück.
Beachten Sie die Klammern um das Objekt-literal, so, dass die geschweiften Klammern nicht täuschen, die für einen code-block
(...) => {...}
.Natürlich, da Sie eine vorhandene Klasse in benannten Feldern nicht ändern, der Klasse, so funktioniert dies nur, wenn Sie eine neue Klasse erstellen. Wenn Sie nur einen dynamischen Namen in einem Ort, wo definieren Sie die Klasse, die Sie benennen, drop können Sie eine zusätzliche erbschaft-und gehen Sie einfach:
Nehmen es ein bisschen weiter spielen mit dynamischen Klassennamen und die dynamische Vererbung, bei der Verwendung von babel kann man nur so etwas tun:
class MyDinamicallyNamedClass ...
Einen Weg, wenn auch nicht ideal, ist einfach mit
eval
:Hinweis, es hat mit
var
. Mitlet
,const
und nurclass
innerhalb dereval
wird nicht funktionieren.Andere Weise mit
Function
:Sitenote: Sie können pass-Geltungsbereich von Variablen in der
Function
und verwenden Sie Sie innerhalb:Function
diese Weise ist aucheval
- und trägt die gleichen Risiken.Function
odereval
. Es ist nicht ein problem, wenn Sie den code stecken in es (f.e. die code-Zeichenfolge wird generiert im gleichen Bereich wie dieFunction
odereval
, ohne input von außen).Function
odereval
. Es ist nicht ein problem, wenn Sie den code stecken in es (f.e. die code-Zeichenfolge wird generiert im gleichen Bereich wie dieFunction
odereval
, ohne input von außen). Wie Sie sehen können in meinem Beispiel die Saiten erzeugt werden in-place, das ist ganz sicher (und vorausgesetzt, mein code ist in einem Modul, es unmöglich ist, die Variablen werden verändert von außen).eval
. Ich ermutige Sie zum hinzufügen einer Warnung zu diesen Effekt.Beispiel, mit denen ich kämpfte, - entschlossen in den Weg unten:
dann: