【问题标题】:ES6 Classes implement indexer like arraysES6 类实现类似数组的索引器
【发布时间】:2021-12-05 03:56:46
【问题描述】:

我想实现索引器以从数据属性中获取元素,索引为 JavaScript 数组。我听说过 ES6 代理,但我无法在课堂上实现它。现在有可能还是我应该等待更多 ES7 的到来。

class Polygon {
    constructor() {
        this.data = new Set(arguments)
    }

    [Symbol.iterator](){
        return this.data[Symbol.iterator]()
    }

    add(vertex){
        this.data.add(vertex)
    }

    remove(vertex){
        this.data.delete(vertex)
    }

    get perimeter(){

    }

    get area(){

    }
}

let poly = new Polygon()
let first_vertex = poly[0]

【问题讨论】:

  • 为什么不直接继承数组?
  • @the8472 如果使用转译器,这可能无法正常工作。与问题中Set 的用法不同,赋值也允许重复值。
  • 我认为这个例子只是一个玩具例子,因为实际上对一个集合进行计数迭代以获得第 N 个元素是相当低效的
  • @the8472 公平点。同意,尽管子类化 Array 现在是一个可行的选择

标签: ecmascript-6


【解决方案1】:

AFAIK 没有关于“索引”到任意对象的建议,所以是的,你必须使用代理。

我无法真正对此进行测试,因为似乎没有环境同时支持类和代理,但理论上,您必须从构造函数返回新的代理对象。在 Chrome v52 中测试。

例子:

class Test {
  constructor(data) {
    let self = this;
    this.data = data;
    this.foo = 'bar';

    return new Proxy(this, {
      get(target, prop) {
        if (Number(prop) == prop && !(prop in target)) {
          return self.data[prop];
        }
        return target[prop];
      }
    });
  }
}

var test = new Test([1,2,3]);
console.log(test[0]); // should log 1
console.log(test.foo); // should log 'bar'

【讨论】:

  • 是的。这是我想要的行为。你知道支持 es6 代理的平台吗?
  • Firefox 似乎支持代理但不支持class 语法。不过你可以用普通的构造函数试试。
  • 我每晚用 Firefox 测试您的示例代码,它按预期工作。现在希望尽快在 node.js 中看到这种支持。谢谢@FelixKling
  • target 可以用来代替 self 我认为,它们表现出严格的平等 target === self
猜你喜欢
  • 2013-01-28
  • 2016-05-05
  • 2011-09-23
  • 1970-01-01
  • 2010-10-26
  • 1970-01-01
  • 2015-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多