我编写了一个小的包装器,以在使用代理访问不存在的属性时返回未定义的错误,而不是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()方法采用一个字符串,因此它可以从初始调用中立即得知您只是尝试访问这么多级别。

07-28 02:24
查看更多