2016-05-25 6 views
1

Ich denke, ich verstehe die Bedeutung von not using ES6 classes, Bewertung der Zusammensetzung über Vererbung und Verwendung factory functions instead of prototype (fühlen Sie sich frei, mich auf irgendwelche dieser Aussagen zu korrigieren, wenn Sie anderer Meinung sind).Wie konvertiere ich diese ES6-Klasse in eine Factory-Funktion?

Meine Frage ist, wie dieses Beispiel mit ES6-Klassen (und ES6-Karte) konvertiert werden, um eine Factory-Funktion zu verwenden.

class DefaultMap extends Map { 
    get(key, defaultValue) { 
    return this.has(key) ? super.get(key) : defaultValue; 
    } 
} 

Beispiel:

const defaultMap = new DefaultMap(); 
defaultMap.set('foo', 'bar'); 
console.log(defaultMap.has('foo')); // true 
console.log(defaultMap.get('foo')); // bar 
console.log(defaultMap.has('baz')); // false 
console.log(defaultMap.get('baz', 'qux')); // qux 
+0

Eine Fabrik Funktion nicht das neue Schlüsselwort verwenden würde – JordanHendrix

+0

Vererbung völlig angemessen, hier zu sein scheint, da 'DefaultMap' * ist -a * 'Karte'. –

+0

Eigentlich ist dies ein schlechter Grund zu erben, OP fügt nur eine einfache Erweiterung zu Map hinzu. –

Antwort

3

Wenn alles, was Sie tun, ist das Hinzufügen einer Funktion zu Map dann gibt es nichts falsch mit Ihrem Ansatz. Ich würde sogar behaupten, dass dies der bevorzugte Weg ist. Aber wenn Sie wirklich eine Fabrik-Funktion anstelle der Vererbung möchten, können Sie es wie folgt erreichen:

function createMap() { 
    var map = new Map(); 
    var oldGet = map.get; 
    map.get = function(key, defaultValue) { 
    return this.has(key) ? oldGet.call(this, key) : defaultValue; 
    }; 
    return map; 
} 

const defaultMap = createMap(); 
... 
+2

Ich habe meine Antwort einfach aufgegeben, weil der darin enthaltene Code tatsächlich mit dem Ihres Codes identisch war. IMO hat sich das OP in einen Glaubenskrieg verstrickt, der etwas dogmatisch erscheint. Für mich wäre die pragmatischste Herangehensweise tatsächlich die Verwendung von Vererbung, aber ähnlich, ein schneller Affe-Patch macht den Job genauso gut und könnte als idiomatischer w.r.t. aktuelle JS-Trends. Pferde für Kurse. – spender

+0

Ich fühle mich definitiv in einem heiligen Krieg eingewickelt und konzentriere mich definitiv viel zu sehr darauf, Dinge zu tun, die aktuelle JS-Trends betreffen, wie du gesagt hast. Ich würde es weiterhin auf Klassenebene machen, aber Mikes Weg scheint auch besser darin zu liegen, bei der Instanziierung einen Standardwert zu setzen. –

+0

@spender Factory-Funktionen stellen auch ** Vererbung ** zur Verfügung, außer Unterklassen von Einbauten wie Karten. Fabriken sind einfach nicht auf Konstrukteure und 'neue' angewiesen. Das ist alles. Kein religiöser Krieg, nirgendwo. – rand