2016-10-30 40 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 /內置原生的es6-with-babel) – jfriend00

+0

原來,NodeJS在這裏是個紅鯡魚 - 最新版本支持它就好了。 Babel的輸出在瀏覽器或節點中不起作用。 –

回答

2

我不知道通天的支持,但Node.js的開始支持(部分)Array因爲4.3.2版本的子類,並在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指定數組可以被分類。大多數瀏覽器不支持這個,但是node.js從4.3.2開始支持。我已經在我的一個項目中使用了它,它的工作方式與你期望的數組工作方式一樣 - 在你的子類數組上正確運行'x [y]'語法 – slebetman

+0

謝謝,問題確實是Babel NodeJS能夠根本運行未經轉發的文件)。我現在使用一個包裝類,並明確地通過push()/ pop()方法。 –