javascript - JavaScript 中的自定义类数组 getter

标签 javascript ecmascript-6 es6-class es6-proxy

我有一个简单的 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;
  }
}

关于javascript - JavaScript 中的自定义类数组 getter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39802382/

相关文章:

javascript - 在div中水平和垂直对齐图像

javascript/jQuery/CSS - 垂直文本?

javascript - 为什么 d3each() 函数仅迭代列表中的第一项?

javascript - Promise.finally 没有作为链的最后一次调用返回

es6-class - react 路由器 : how to pass "match" object into a component declared as an ES6 class?

javascript - 用从评论内容派生的子树替换 JavaScript AST 中的评论

javascript - 在 React 中设置 jsx 元素的样式

javascript - react : Array not rendering in correct order after first time

ecmascript-6 - Parenscript 中的 ES6 样式类

javascript - 期望从 promise 分配的值(Jest unittest)