当使用代理访问不存在的属性时,我写了一个小的包装器来返回 undefined 来代替 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
我收到一个类型错误
我的问题是如何扩展上面的函数以处理深层嵌套对象?
谢谢
最佳答案
您需要将返回值包装在您的代理函数中:
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()
方法接受一个字符串,因此它可以从初始调用中立即知道您只是试图访问这么多级别。
关于javascript - es6 代理安全深层对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42962795/