The World of Remnant

时间回溯对象

闭包实现功能、proxy简化操作


function timeBack(data = {}) {
    let store = []
    let index = 0
    function deepClone(obj) {
      var result = Array.isArray(obj) ? [] : {};
      if (obj && typeof obj === "object") {
        for (key in obj) {
          if (obj.hasOwnProperty(key)) {
            if (obj[key] && typeof obj[key] === "object") {
              result[key] = deepClone(obj[key]);
            } else {
              result[key] = obj[key];
            }
          }
        }
      }
      return result;
    }
    let methods = {
        history(){
          return store
        },
        goback(num){
          data = deepClone(store[num])
        },
        getData(prop) {
          return data[prop]
        },
        setData(prop,value){
          store.push(Object.assign({index},deepClone(data)))
          index ++
          data[prop] = value
        }
      }
  return new Proxy(methods,{
    get(target, property, receiver) {
      if (property === 'history' || property === 'goback'){
        return Reflect.get(target, property, receiver);
      }
      return target.getData(property)
    },
    set(target, property, value, receiver) {
      return target.setData(property, value);
    }
  })
}

let data = {a:1}
let p = timeBack(data)
p.a = 2
console.log(p.a); //像普通对象一样赋值、读取
p.name = 'ka'
p.food = ['apple','beer','milk']
p.food = null
p.a = null
console.log(p); //只暴露方法,不暴露属性
console.log(p.history()); //查看历史记录
p.goback(3)
console.log(p.food); //回溯到任意历史状态