2016-10-30 18 views
4

Ich möchte eine Shortcut-Methode für die Inspektion des Endes eines Stapels definieren.Wie kann ich die Array-Klasse in Babel erweitern?

Folgende Arbeiten in Firefox:

const Stack = class extends Array { 
    last() { 
    return this[this.length - 1]; 
    } 
} 

jedoch danach mit Babel kompilieren, funktioniert es nicht:

var Stack = function (_Array) { 
    _inherits(Stack, _Array); 

    function Stack() { 
    _classCallCheck(this, Stack); 

    return _possibleConstructorReturn(this, Object.getPrototypeOf(Stack).apply(this, arguments)); 
    } 

    _createClass(Stack, [{ 
    key: 'last', 
    value: function last() { 
     return this[this.length - 1]; 
    } 
    }]); 

    return Stack; 
}(Array); 


console.log(Stack.prototype.last); // works 
console.log((new Stack()).last); // doesn't work 
Array.prototype.last = Stack.prototype.last; 
console.log((new Stack()).last); // works 

Aus irgendeinem Grund ich Funktionen auf den neuen Prototyp hinzufügen , aber sie werden nicht für Instanzen dieses Prototyps verfügbar sein, es sei denn, sie werden direkt in den Array-Prototyp eingefügt (was offensichtlich wegen möglicher Nebenwirkungen schlecht ist).


aktualisieren: Es könnte mehrere Möglichkeiten, dies zu umgehen (einschließlich Proxy-Objekte oder den Prototyp erstreckt manuell statt extends zu verwenden), aber da meine Stack nicht wirklich Notwendigkeit die meisten der Array-Methoden, verwende ich jetzt einfach einen Wrapper.

const Stack = class { 
    constructor(...x) { 
     this.arr = [...x]; 
    } 
    pop() { 
     return this.arr.pop(); 
    } 
    push(...x) { 
     return this.arr.push(...x); 
    } 
    top() { 
     return this.arr[this.arr.length - 1]; 
    } 
    size() { 
     return this.arr.length; 
    } 
    } 
+0

Wahrscheinlich Duplikat: [Erweiterung Einbau-Eingeborenen in ES6 mit Babel] (http://stackoverflow.com/questions/33832646/extending-built-in-natives-in-es6-with-babel) – jfriend00

+0

Es stellte sich heraus, dass NodeJS war hier ein Ablenkungsmanöver - die neueste Version unterstützt es einfach gut. Babels Ausgabe funktioniert nicht im Browser oder Knoten. –

Antwort

2

Ich bin über Babel Unterstützung nicht sicher, aber node.js gestartet Unterstützung (teilweise) Array Subklassifizieren seit Version 4.3.2 und implementiert volle Subklassifizieren Unterstützung in Version 6.8.1 (http://node.green/#Array-is-subclassable). Also, wenn Sie Knoten 6 verwenden Array Unterklasse sollte funktionieren.

Wenn Babel Sie versagt können Sie immer tun es die "klassische" Art und Weise:

// Code tested and works in 6.3.1: 
function Stack =() {}; 
Stack.prototype = Object.create(Array.prototype); 
Stack.prototype.last = function() { 
    return this[this.length - 1]; 
} 

var s = new Stack(); 
+0

Ist das Problem mit dem "klassischen" Weg nicht, dass Array-Methoden, die neue Arrays zurückgeben (wie '.slice()'), den abgeleiteten Typ nicht zurückgeben? – jfriend00

+0

@ jfriend00: das ist kein Problem mit der prototypischen Vererbung oder Klassenvererbung. Schließlich macht die ES6-Spezifikation Klassen nur Syntax-Zucker über Prototypen - sie sind das Gleiche. Das Problem ist Unterstützung für Unterklassen. ES6 gibt an, dass Array unterklassiert werden kann. Die meisten Browser unterstützen dies noch nicht, aber node.js unterstützt seit 4.3.2. Ich habe es in einem meiner Projekte verwendet und es funktioniert genau so, wie Sie erwarten, dass Arrays funktionieren - bis zur 'x [y]' - Syntax, die auf Ihrem untergeordneten Array funktioniert – slebetman

+0

Danke, das Problem war in der Tat Babel (nach der Aktualisierung NodeJS, um die nicht-transpilierte Datei überhaupt ausführen zu können). Ich verwende jetzt eine Wrapper-Klasse und übergebe die push()/pop() -Methoden explizit. –

Verwandte Themen