2016-10-30 6 views
4

私はスタックの終わりを調べるためのショートカットメソッドを定義したいと思います。BabelのArrayクラスをどのように拡張できますか?

Firefoxで次のような作品:

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

しかし、バベルでこれをコンパイルした後、それは動作しません:

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 

何らかの理由で、私は新しいプロトタイプに関数を追加することができますArrayプロトタイプに直接挿入しない限り、プロトタイプのインスタンスでは使用できません(潜在的な副作用のために明らかに悪い方法です)。


更新:あり(プロキシオブジェクトを含む、またはその代わりにextendsを使用しての手動でのプロトタイプを拡張する)これを回避する方法はいくつかあることが、私のStackんではない、本当に以来のほとんどを必要とする場合があります配列メソッド、私は今、単にラッパーを使用しています。

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

そうな重複:[バベルとES6に内蔵された原住民の拡張](http://stackoverflow.com/questions/33832646/extended-built-in-es6-with-babel) – jfriend00

+0

NodeJSはここで赤字だったことが判明しました。最新バージョンでは正常にサポートされています。 Babelの出力は、ブラウザまたはノードでは機能しません。 –

答えて

2

私はバベルのサポートについてはよく分からないが、Node.jsのバージョン4.3.2以降(一部)Arrayサブクラス化を支援を開始し、バージョン6.8.1(http://node.green/#Array-is-subclassable)にフルサブクラスのサポートを実装しました。したがって、ノード6を使用している場合は、Arrayサブクラス化が機能するはずです。

バベルがあなたを失敗している場合は、常に「古典的」な方法行うことができます。

// 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

"古典的な"方法の問題は、新しい配列( '.slice()'など)を返す配列メソッドが派生型を返さないということですか? – jfriend00

+0

@ jfriend00:プロトタイプの継承やクラス継承には問題ありません。結局のところ、ES6仕様では、クラスをプロトタイプの上に単に構文砂糖を作るだけで、同じことです。問題は、サブクラス化のサポートです。 ES6は、Arrayをサブクラス化できることを指定します。ほとんどのブラウザーはこれをまだサポートしていませんが、node.jsは4.3.2からのサポートを開始しました。私は自分のプロジェクトの1つで使ったことがあり、配列がうまく動作するように動作します - サブクラス化された配列で正しく動作する 'x [y] '構文になります – slebetman

+0

ありがとう、問題は確かにBabel NodeJSは非トランスファイルされたファイルをまったく実行できません)。私は今、ラッパークラスを使用して、push()/ pop()メソッドを明示的に渡しています。 –

関連する問題