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

class Ring extends Array {
    insert (item, index) {
        this.splice(index, 0, item);
        return this;
    }
}

我想使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];
    }
});
myRing现在是支持包装索引的Ring对象。问题是我必须每次都这样定义Ring对象。有没有办法将此代理应用于类,以便调用new Ring()返回它?

最佳答案

基本上是

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;
  }
}

10-01 03:58