我希望在一个名为ObservableList
的自定义类中使用Proxy
,它包含一个Array
。由于Proxy
只能在ES6之后使用,所以我想知道是否有任何替代实现。
我的要求是,一旦ObservableList
更改,观察者会得到更新(而不是通知),以使观察者始终与具有某些过滤或映射方法的可观察对象保持一致。
var activities = new ObservableList(['reading', 'swimming']);
var sAct = activities.filter(function(v) {
return v[0] === 's';
});
// expect sAct.list to be ['swimming']
var meAct = activities.map(function(v) {
return 'I am ' + v;
});
// expect meAct.list to be ['I am reading', 'I am swimming']
activities.list.push('smiling');
console.log(sAct.list, meAct.list);
// expect sAct.list to be ['swimming', 'smiling']
// expect meAct.list to be ['I am reading', 'I am swimming', 'I am smiling']
activities.list[1] = 'snoopying';
console.log(sAct.list, meAct.list);
// expect sAct.list to be ['swimming', 'snoopying']
// expect meAct.list to be ['I am reading', 'I am snoopying', 'I am smiling']
使用代理的实现可以在 https://jsfiddle.net/ovilia/tLmbptr0/3/ 上找到。
activities.push
还是activities.list.push
? - Bergipush
方法和分配给已经存在的索引。你还需要什么?请具体说明。 - Bergiactivities.list.push
。我需要所有数组操作,比如push
、shift
、splice
等都被监视。 - OviliaArray
并覆盖每个更新方法,使其调用 super 然后通知观察者即可。 - Bergi