Javascript 如何在Babel中扩展数组类?

Javascript 如何在Babel中扩展数组类?,javascript,babeljs,Javascript,Babeljs,我想定义一个检查堆栈末尾的快捷方法 以下内容在Firefox中适用: const Stack = class extends Array { last() { return this[this.length - 1]; } } 但是,使用Babel编译后,它不起作用: var Stack = function (_Array) { _inherits(Stack, _Array); function Stack() { _classCallCheck(this

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

以下内容在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
出于某种原因,我可以将函数添加到新原型中,但除非它们直接插入到阵列原型中(由于潜在的副作用,这显然是一种不好的做法),否则它们将无法用于该原型的实例


更新:可能有几种方法可以解决这个问题(包括代理对象,或者手动扩展原型,而不是使用
扩展
),但是由于我的
堆栈
实际上并不需要大多数数组方法,所以我现在只使用包装器

  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()中实现了完整的子类化支持。因此,如果您使用的是节点6
Array
子类化应该可以工作

如果巴贝尔让你失望,你可以用“经典”的方式:


您可以使用此插件(Babel 6):


该插件描述了IE的一些限制这是我的解决方案。现在,myArray对象被视为myArray,而不是数组类类型

class myArray extends Array
{
    constructor(...args) {
        super(...args);
    
        this.constructor = myArray;
        this.__proto__ = myArray.prototype;
    };
}

很可能是重复的:事实证明NodeJS在这里是一条红鲱鱼——最新版本对它的支持很好。Babel的输出在浏览器或节点中不起作用。“经典”方式的问题不在于返回新数组的数组方法(如
.slice()
)不返回您的派生类型吗?@jfriend00:原型继承或类继承没有问题。毕竟,ES6规范使得类仅仅是原型之上的语法糖——它们是一样的。问题是支持子类化。ES6指定数组可以被子类化。大多数浏览器还不支持这一点,但node.js从4.3.2开始支持。我曾在我的一个项目中使用过它,它的工作原理与您期望的数组工作原理完全相同—一直到
x[y]
语法在您的子类ArrayTanks上正常工作,问题确实是Babel(在更新NodeJS以便能够运行未传输的文件之后)。我现在使用一个包装器类并显式地传递push()/pop()方法。嘿,你能详细介绍一下这个更新吗?我正在使用Babel7,扩展Map类时遇到问题。我应该如何设置它?我不记得这方面的细节,但我会提出一个新的问题,包括你得到的错误(如果是在编译过程中,或者当你试图在特定环境中使用编译后的代码时)和你尝试的任何插件。这里是:升级到Babel 7是我唯一的工作选择
class myArray extends Array
{
    constructor(...args) {
        super(...args);
    
        this.constructor = myArray;
        this.__proto__ = myArray.prototype;
    };
}