JavaScript中的自定义数组类getter

ETH*_*ons 10 javascript ecmascript-6 es6-proxy es6-class

我有一个简单的ES6类,如下所示:

class Ring extends Array {
    insert (item, index) {
        this.splice(index, 0, item);
        return this;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想这样做,以便Ring对象的索引包装,所以new Ring(1, 2, 3)[3]返回1,new Ring(1, 2, 3)[-1]返回3,依此类推.这可能在ES6中吗?如果是这样,我将如何实现它?

我已经阅读了代理,它允许完全自定义的getter,但我无法弄清楚如何将代理应用于类.我确实管理了这个:

var myRing = new Proxy (Ring.prototype, {
    get: function (target, name) {
        var len = target.length;
        if (/^-?\d+$/.test(name))
            return target[(name % len + len) % len];
        return target[name];
    }
});
Run Code Online (Sandbox Code Playgroud)

myRing现在是一个支持包装索引的Ring对象.问题是我每次都必须定义像这样的Ring对象.有没有办法将此代理应用于类,以便调用new Ring()返回它?

Est*_*ask 6

基本上是

class ProxyRing extends Array {
  constructor(...args) {
    super(...args)

    return new Proxy(this, {
      get: function (target, name) {
          var len = target.length;
          if (typeof name === 'string' && /^-?\d+$/.test(name))
              return target[(name % len + len) % len];
          return target[name];
      }
    });
  }

  insert (item, index) {
      this.splice(index, 0, item);
      return this;
  }
}
Run Code Online (Sandbox Code Playgroud)