Erstellen Sie mit JavaScript eine leistungsstarke Aufzählung mit Feldern und Methoden wie Java

Java-Aufzählung

Java Enum ist sehr komplex und Sie können Enum mit mehreren Feldern und Methoden wie folgt erstellen.

Java.Color.java


enum Color {
	RED("rot", 255, 0, 0),
	YELLOW("Gelb", 255, 255, 0),
	GRAY("grau", 155, 155, 155);
	Color(String name, int r, int g, int b) {
		this.name = name;
		this.r = r;
		this.g = g;
		this.b = b;
	}
	public String name;
	public int r, g, b;
	public String toHexCode() {
		return String.format("#%02x%02x%02x", r, g, b);
	}
}
System.out.println(Color.YELLOW.toHexCode()); // => "#ffff00"
System.out.println(Color.GRAY.name); // => "grau"

In JavaScript implementiert

Wenn Sie dies gehorsam mit JavaScript implementieren, wird es sicherlich so aussehen.

JavaScript.color.js


var Color = (function() {
  var InnerType = function(name, r, g, b) {
    this.name = name;
    this.r = r;
    this.g = g;
    this.b = b;
  };
  InnerType.prototype.toHexCode = function() {
    return '#' + ('00' + this.r.toString(16)).slice(-2) + ('00' + this.g.toString(16)).slice(-2) + ('00' + this.b.toString(16)).slice(-2);
  };
  return {
    RED : new InnerType('rot', 255, 0, 0),
    YELLOW : new InnerType('Gelb', 255, 255, 0),
    GRAY : new InnerType('grau', 155, 155, 155)
  };
})();
console.log(Color.YELLOW.toHexCode()); // => "#ffff00"
console.log(Color.GRAY.name); // => "grau"

Es sieht auf den ersten Blick gut aus, aber ... In Java ist es natürlich, diese Aufzählung als Schlüssel für Map zu verwenden.

Map<Color, Integer> colorNums = new HashMap<>();
colorNums.put(Color.RED, 10);
colorNums.put(Color.YELLOW, 20);
colorNums.put(Color.GRAY, 30);
System.out.println(colorNums.get(Color.RED)); // => "10"
System.out.println(colorNums.get(Color.YELLOW)); // => "20"

In der JavaScript-Version

var colorNum = {};
colorNum[Color.RED] = 10;
colorNum[Color.YELLOW] = 20;
colorNum[Color.GRAY] = 30;
console.log(colorNum[Color.RED]); // => "30" !!?
console.log(colorNum[Color.YELLOW]); // => "30" !!?

Und es verhält sich nicht wie beabsichtigt. Da Color.RED, Color.YELLOW und Color.GRAY Objekte sind, wird die Standardeinstellung toString des Objekts aufgerufen, wenn es zum Schlüssel des assoziativen Arrays wird und alle drei zu "[Objektobjekt]" werden. Ursache.

Implementiert in JavaScript (modifizierte Version)

Wenn Sie also versuchen, für jede mit toString eine eindeutige Zeichenfolge wie folgt zurückzugeben, funktioniert dies wie beabsichtigt.

JavaScript.color_fix.js


var Color = (function() {
  const InnerType = function(name, r, g, b, toStringValue) {
    this.name = name;
    this.r = r;
    this.g = g;
    this.b = b;
    this.toString = function() {
      return toStringValue;
    };
  };
  InnerType.prototype.toHexCode = function() {
    return '#' + ('00' + this.r.toString(16)).slice(-2) + ('00' + this.g.toString(16)).slice(-2) + ('00' + this.b.toString(16)).slice(-2);
  };
  return {
    RED : new InnerType('rot', 255, 0, 0, 'RED'),
    YELLOW : new InnerType('', 255, 255, 0, 'YELLOW'),
    GRAY : new InnerType('', 155, 155, 155, 'GRAY')
  };
})();
var colorNum = {};
colorNum[Color.RED] = 10;
colorNum[Color.YELLOW] = 20;
colorNum[Color.GRAY] = 30;
console.log(colorNum[Color.RED]); // => "10"
console.log(colorNum[Color.YELLOW]); // => "20"

JavaScript.color_fix_es6.js


const Color = (() => {
  const InnerType = function(name, r, g, b) {
    this.name = name;
    this.r = r;
    this.g = g;
    this.b = b;
    const sym = Symbol();
    this.toString = () => sym;
  };
  InnerType.prototype.toHexCode = function() {
    return '#' + ('00' + this.r.toString(16)).slice(-2) + ('00' + this.g.toString(16)).slice(-2) + ('00' + this.b.toString(16)).slice(-2);
  };
  return {
    RED : new InnerType('', 255, 0, 0),
    YELLOW : new InnerType('Es war gräulich. Implementiert in JavaScript (ES6-Version) Es ist jedoch etwas enttäuschend, die Zeichenfolge für toString selbst anzugeben. Wenn Sie also ES6 verwenden können, ist es besser, sie mit Symbol () zu automatisieren. rot', 255, 255, 0),
    GRAY : new InnerType('grau', 155, 155, 155)
  };
})();

Javas Aufzählung ist die stärkste, aber die Flexibilität von JavaScript, mit der fast dasselbe erreicht werden kann, ist gut.

Recommended Posts

Erstellen Sie mit JavaScript eine leistungsstarke Aufzählung mit Feldern und Methoden wie Java
Socket-Kommunikation mit einem Webbrowser über Java und JavaScript ②
Socket-Kommunikation mit einem Webbrowser über Java und JavaScript ①
Erstellen Sie eine Java- und JavaScript-Teamentwicklungsumgebung (Gradle-Umgebungskonstruktion)
[Java] Erstellen und Anwenden eines Folienmasters
Probieren wir WebSocket mit Java und Javascript aus!
[Java] Erstellen Sie mit dem Befehl jar eine JAR-Datei, die sowohl komprimiert als auch nicht komprimiert ist
Java und JavaScript
Erstellen Sie eine CSR mit erweiterten Informationen in Java
Erstellen Sie mit Java + MySQL ein einfaches Bulletin Board
Lassen Sie uns mit Javas Timer einen zeitgesteuerten Prozess erstellen! !!
[Java] Erstellen Sie so etwas wie eine Produktsuch-API
[Java] Erstellen Sie eine Sammlung mit nur einem Element
Bereiten Sie eine Scraping-Umgebung mit Docker und Java vor
So greifen Sie auf Java Private-Methoden und -Felder zu
Ich habe versucht, mit Java und Spring eine Funktion / einen Bildschirm für den Administrator einer Einkaufsseite zu erstellen
[Java] Erstellen Sie einen Filter
[Anfänger] Erstellen Sie ein wettbewerbsfähiges Spiel mit grundlegenden Java-Kenntnissen
Implementieren Sie Singleton mit Enum schnell in Java
[Hinweis] Erstellen Sie mit Docker eine Java-Umgebung von Grund auf neu
Erstellen Sie eine Java, JavaScript-Teamentwicklungsumgebung (Problemstellung)
Erstellen Sie eine JAVA WEB App und probieren Sie OMC APM aus
Ich habe versucht, mit Chocolatey eine Java8-Entwicklungsumgebung zu erstellen
Ich möchte eine Liste mit Kotlin und Java erstellen!
Ich möchte eine Funktion mit Kotlin und Java erstellen!
Erstellen Sie einen SlackBot mit AWS Lambda & API Gateway in Java
Definieren Sie abstrakte Methoden in Java enum und schreiben Sie deren Verhalten
Java lernen: Verwenden Sie Timer, um so etwas wie einen Bomben-Timer zu erstellen
[Java] Generics-Klasse und Generics-Methode
Erstellen Sie eine Java-Methode [Memo] [java11]
[Java] Erstellen Sie eine temporäre Datei
Erstellen Sie einen Spielplatz mit Xcode 12
Java-Methoden und Methodenüberladungen
Java abstrakte Methoden und Klassen
Erstellen Sie einen einfachen Webserver mit der Java-Standardbibliothek com.sun.net.httpserver
Ich kann in IntelliJ keine Java-Klasse mit einem bestimmten Namen erstellen
Erstellen Sie eine JVM für die App-Verteilung mit JDK 9-Modulen und jlink
[Swift] Erstellen Sie ein Projekt mit Xcode (Version 12.1) und zeigen Sie "Hallo Welt!"
[Java] Erstellen wir einen Minecraft Mod 1.16.1 [Bäume hinzufügen und generieren]
Hinweis Nr. 2 "Erstellen eines Suchverlaufs mit ArrayList und HashSet" [Java]
[Java] Erstellen wir einen Minecraft Mod 1.14.4 [9. Bäume hinzufügen und generieren]
[Java] Lass uns einen Minecraft Mod 1.14.4 erstellen [8. Erz hinzufügen und erzeugen]
Lassen Sie uns mit Generic Dao und Hibernate einen Parameter-Polymorph-Mechanismus erstellen
Informationen zu statischen und nicht statischen Java-Methoden
Erstellen eines Java-Projekts mit Gradle
Verwenden Sie Java mit MSYS und Cygwin
Verteilte Ablaufverfolgung mit OpenCensus und Java
[Java] Verzweigungsaufzählung mit switch-Anweisung
Verwenden Sie JDBC mit Java und Scala.
Erstellen Sie ein Java-Projekt mit Eclipse
PDF und TIFF mit Java 8 ausgeben
[Java] Reduzieren Sie if-Anweisungen mit Enum
Java 8 studieren (StaticIF und Standardmethode)