当前位置: 首页 > 知识库问答 >
问题:

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

逄岳
2023-09-17
  // 设计一个函数 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  }

共有2个答案

党航
2023-09-17

不太理解 safeGet 的应用场景?
有没有一种可能, ?. 可选链操作符 比较方便?
var x = { a: { b: 1 } };

console.log(x?.a) // { b: 1 }
console.log(x?.a.b.c) // undefined

PS: 需要优化兼容好像是 ES9 还是 ES10 的不记得了
PS:需要优化格式化插件,可能会被格式转成 x ? .a.b.c

姚高韵
2023-09-17
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);
 类似资料: