可以通过实施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 };
}
}
}
}
}
}
答案 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方法。