我编写了一个小的包装器,以在使用代理访问不存在的属性时返回未定义的错误,而不是typeError。这是代码:
function proxify(event) {
var proxy = new Proxy(event, {
get: function (target, property) {
if (property in target) {
return target[property];
} else {
return '';
}
}
}
});
return proxy;
}
当属性缺少1级深度时,此方法有效。
例如,假设obj.something不存在:
obj.something.else
将返回未定义
但是如果对象属性是深层嵌套的
obj.something.else.deeper
我收到一个typeError
我的问题是如何扩展上述功能以在深层嵌套对象上工作?
谢谢
最佳答案
您需要将返回值包装在proxify函数中:
function proxify(event) {
return isPrimitive(event) ? event : new Proxy(event, { get: getProp });
}
function isPrimitive(v) {
return v == null || (typeof v !== 'function' && typeof v !== 'object');
}
function getProp (target, property) {
if (property in target) {
return proxify(target[property]);
} else {
return proxify({});
}
}
老实说,最好使用lodash's
_.get()
或ramda's R.path()
之类的东西。无法从第一个getProp()
调用中知道评估将进行多少层,因此它必须始终返回一个原始值或一个“真实的” Proxy
实例,以便可以拦截下一个属性访问(如果发生一次) )。另一方面,_.get()
方法采用一个字符串,因此它可以从初始调用中立即得知您只是尝试访问这么多级别。