设计模式- JavaScript.安全提取深层(可能不存在)对象属性的通用函数

design patterns - JavaScript. Universal function to extract deep (probably non-existent) object property safely

本文关键字:对象 不存在 属性 函数 安全 JavaScript 提取 设计模式      更新时间:2023-09-26

我想设计一个辅助函数,它将尝试执行作为参数深度属性路径传递并返回由它提取的值。

例如考虑以下代码

var foo = {
        bar: [
            {
                baz: "someValue"
            }
        ]
};
function getByPath(path) {
    var val;
    try {
        val = eval(path);    
    } catch(e) {
        console.error(e);
    }
    return val;
}
var path1 = "foo.bar[2].baz";
var path2 = "foo.bar[0].baz";
var path3 = "foo.bar.baz";
console.log(path1 + ": " + getByPath(path1));
console.log(path2 + ": " + getByPath(path2));
console.log(path3 + ": " + getByPath(path3));
console.log("done.");

输出
TypeError: Cannot read property 'baz' of undefined
    at eval (eval at getByPath (unknown source), <anonymous>:1:11)
    at getByPath (<anonymous>:13:15)
    at <anonymous>:24:28
    at Object.InjectedScript._evaluateOn (<anonymous>:895:140)
    at Object.InjectedScript._evaluateAndWrap (<anonymous>:828:34)
    at Object.InjectedScript.evaluate (<anonymous>:694:21)getByPath @ VM317:15(anonymous function) @ VM317:24InjectedScript._evaluateOn @ VM212:895InjectedScript._evaluateAndWrap @ VM212:828InjectedScript.evaluate @ VM212:694
VM317:24 foo.bar[2].baz: undefined
VM317:25 foo.bar[0].baz: someValue
VM317:26 foo.bar.baz: undefined
VM331:7 done.

所以这里一切都很好:提取存在的属性,返回不存在的undefined,捕获异常,并且在尝试读取undefined的属性时打印堆栈跟踪。

但是这个函数在javascript代码在服务器上被压缩的情况下是不可靠的,因为对象/属性名可以被压缩器和路径缩短,比如"foo.bar[0]"。"Baz"将不再存在(正确的应该是"a.b[0].c")。

有一个很好的解决方案,除了玩压缩机设置?

答案是否定的。如果不能预测属性和变量的名称,就没有办法安全地重建路径。

可能有一种方法可以使用源映射来解决这个问题,但这通常是不可取的,而且,我认为,要做很多工作。

可以获得由javascript压缩器生成的源地图,并借助if翻译路径。但是这不是我推荐的。

知道深层引用是缓慢的,应该避免。我猜您的helper函数是用于调试的。如果是这种情况,我会简单地使用未压缩的js文件。