有没有办法观察ES6 Maps和Sets的新增和删除?Object.observe不起作用,因为它只适用于被观察对象的直接属性。理论上可以观察到
size
属性,但无法提供确切的更改信息。另一个想法是替换对象的set
和get
函数与代理版本。是否有更好的方法?如果没有,我很惊讶在编写ES6提案时没有人想到这一点。size
属性,但无法提供确切的更改信息。另一个想法是替换对象的set
和get
函数与代理版本。是否有更好的方法?如果没有,我很惊讶在编写ES6提案时没有人想到这一点。目前无法对Set/Map
进行子类化。那么这个方法怎么样(只是一个草率的例子)?
//ECMAScript 2015
class XMap
{
constructor(iterable, observer = null)
{
this._map = new Map(iterable);
this._observer = observer;
this._changes = {};
}
set(key, value)
{
this._changes.prev = this._map.get(key);
this._changes.new = value;
this._map.set(key, value);
if(this._observer !== null)
{
this._observer(this._changes);
}
}
get(key)
{
return this._map.get(key);
}
}
var m = new XMap([[0, 1]], changes => console.log(changes));
m.set(0,5); // console: Object {prev: 1, new: 5}
m.set(0,15); // console: Object {prev: 5, new: 15}
set
/get
。 - Bergi