【发布时间】:2016-10-30 01:20:21
【问题描述】:
我想定义一个检查堆栈末端的快捷方法。
以下在 Firefox 中有效:
const Stack = class extends Array {
last() {
return this[this.length - 1];
}
}
但是,用 Babel 编译后,它不起作用:
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 并没有真正需要大部分 Array 方法,我现在只是使用包装器。
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;
}
}
【问题讨论】:
-
原来 NodeJS 在这里是一个红鲱鱼 - 最新版本支持它就好了。 Babel 的输出在浏览器或节点中不起作用。
标签: javascript babeljs