/** * 有如下对象data *
* 现需要将 data 转换为另一个数据结构 state *
* 且满足以下要求 *
* 1. state() == { a: { b: { c: 1 } } } *
* 2. state.a() == { b: { c: 1 } } *
* 3. state.a.b() == { c: 1 } *
* 4. state.a.b.c() == 1 *
* 5. state.a.b.d() == undefined *
* 6. state.a.e.f() == undefined *
* 7. state.g(4) == 4 */
// const data = { a: { b: { c: 1 } } };
// function transform(data) {
// }
function transform(data) {
function state (){
return data;
}
state['g']=(val)=>val;
const traverse = (obj, parent) => {
Object.keys(obj).forEach(key => {
const value = obj[key];
parent[key] = () => value;
// console.log('key',key,obj[key]);
if (typeof value === 'object') {
traverse(value, parent[key]);
}
});
};
let handler = {
get (target, key, receiver) {
// 递归创建并返回
if (typeof target[key] === 'function' && target[key] !== null) {
return new Proxy(target[key], handler)
}
if(key in target){
return Reflect.get(target, key, receiver)
}else{
target[key]=()=>undefined
return new Proxy(target[key], handler)
}
},
set (target, key, value, receiver) {
return Reflect.set(target, key, value, receiver)
}
}
let proxy = new Proxy(state, handler)
traverse(data, proxy);
return proxy;
}
const data = { a: { b: { c: { d : 1 } } } };
const test = transform(data);
console.log(test());
console.log(test.a());
console.log(test.a.b());
console.log(test.a.b.c());
console.log(test.g(4));
console.log(test.a.b.c.d());
console.log(test.a.t.f.f());
算法题 Proxy
最新推荐文章于 2024-07-15 14:11:16 发布