javascript - es6 代理安全深层对象

标签 javascript node.js

当使用代理访问不存在的属性时,我写了一个小的包装器来返回 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/

相关文章:

使用循环的javascript对象操作

javascript - 找不到 express - `-bash: express: command not found`

node.js - 是否可以只获取 sequelize 属性的值?

javascript - 如何在:run after tests finish execution之后触发cypress

JavaScript : Save/Load array to a file?

javascript - 如何以正确的方式从 Javascript 隐藏的输入类型中获取值?

javascript - 禁用 Javascript 时显示占位符 HTML

javascript - GraphQL:在 GraphQLObjectType 中使用自定义类型定义 GraphQLList 时出错

mysql - Node : MySQL sometimes raises ETIMEDOUT error

javascript - 在 javascript 中检查内容 css