gpt4 book ai didi

javascript - 如何扩展 Babel 中的 Array 类?

转载 作者:搜寻专家 更新时间:2023-11-01 04:29:42 24 4
gpt4 key购买 nike

我想定义一个检查栈尾的快捷方法。

以下在 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

出于某种原因,我可以向新原型(prototype)添加函数,但是除非将它们直接插入到 Array 原型(prototype)中,否则它们将无法用于该原型(prototype)的实例(由于潜在的副作用,这显然是不好的做法) .


更新:可能有几种方法可以解决这个问题(包括 Proxy 对象,或者手动扩展原型(prototype)而不是使用 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;
}
}

最佳答案

我不确定 Babel 支持,但 node.js 从 4.3.2 版开始支持(部分)Array 子类化,并在 6.8.1 版(http://node.green/#Array-is-subclassable)中实现了完整的子类化支持。因此,如果您使用的是 node 6 Array 子类化应该可以。

如果 Babel 让你失望了,你总是可以用“经典”的方式来做:

// 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();

关于javascript - 如何扩展 Babel 中的 Array 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40325212/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com