我想定義一個檢查堆棧結束的快捷方法。如何擴展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;
}
}
可能的重複:[擴展內置與巴貝爾ES6當地人(http://stackoverflow.com/questions/33832646 /內置原生的es6-with-babel) – jfriend00
原來,NodeJS在這裏是個紅鯡魚 - 最新版本支持它就好了。 Babel的輸出在瀏覽器或節點中不起作用。 –