定义对象的索引器

时间:2018-03-04 11:46:19

标签: javascript

可以通过实施iterable来制作对象[Symbol.iterator]

但是如何覆盖[]运算符的行为?

例如,我有一个对象,里面有一个数组,我希望能够访问给定像obj[3]这样的索引。

可能吗?

例如

const SignalArray = (data = []) => {
...
return {
        add,
        remove,
        onAdd,
        onRemove,
        onSort,
        removeOnAdd,
        removeOnRemove,
        removeOnSort,
        [Symbol.iterator]() {
            return {
                next: () => {
                    if (index < data.length) {
                        return { value: data[index++], done: false };
                    } else {
                        index = 0; 
                        return { done: true };
                    }
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:5)

  

如何覆盖[]运算符的行为?

仅通过ES2015中添加的Proxy。您将提供get trap并处理您要处理的属性键。

以下是我们检查可以成功强制转换为数字并返回数字* 2的属性名称的示例:

const o = new Proxy({}, {
  get(target, prop, receiver) {
    const v = +prop;
    if (!isNaN(v)) {
      return v * 2;
    }
    return Reflect.get(...arguments);
  }
});
o.x = "ex";
console.log(o[2]); // 4
console.log(o[7]); // 14
console.log(o.x);  // "ex"

如果要覆盖设置数组元素,则使用set trap。还有其他几个陷阱。例如,在回复评论时,you said

  

...如果你讨厌es6类,并想在数组周围编写一个包装器来提供额外的功能,比如一个可观察的数组......

......这可能涉及set陷阱并覆盖各种mutator方法。