使用Proxy怎么实现一个safeGet函数?

作者站长头像
站长
· 阅读数 7
  // 设计一个函数 safeGet,可以对任意对象进行处理使其满足
  const x = safeGet({
    a: 'hello',
    b: { d: 'world' },
    c: [-100, 200, -300],
  });
  
  x.a() === 'hello'
  x.b.d() === 'world'
  x.c[0]() === -100
  x.c[100]() === undefined
  x.c[100](1234) === 1234
  x.c.map((e) => e()) === [-100, 200, -300]
  x.d.e() === undefined
  x.d.e('optional default value') === 'optional default value'
  x.y.z.a.b.c.d.e.f.g.h.i.j.k() === undefined
  
  function safeGet(data) {
      // write code here
  }
回复
1个回答
avatar
test
2024-06-27
function safeGet(data) {
    return new Proxy(() => {}, {
        get(target, prop) {
            if (data !== undefined && prop in data) {
                const value = data[prop];
                if (typeof value === 'function' && prop !== 'constructor') {
                    return value.bind(data);
                }
                return safeGet(value);
            } else {
                return safeGet(undefined);
            }
        },
        apply(target, thisArg, args) {
            if (data !== undefined) {
                return data;
            }
            if (args.length > 0) {
                return args[0];
            }
            return undefined;
        }
    });
}

// 测试
const x = safeGet({
    a: 'hello',
    b: { d: 'world' },
    c: [-100, 200, -300],
});

console.log(x.a() === 'hello');
console.log(x.b.d() === 'world');
console.log(x.c[0]() === -100);
console.log(x.c[100]() === undefined);
console.log(x.c[100](1234) === 1234);
console.log(JSON.stringify(x.c.map((e) => e())) === JSON.stringify([-100, 200, -300]));
console.log(x.d.e() === undefined);
console.log(x.d.e('optional default value') === 'optional default value');
console.log(x.y.z.a.b.c.d.e.f.g.h.i.j.k() === undefined);

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容