闭包实现功能、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); //回溯到任意历史状态