javascript - 我可以在 Proxy 和 trap 中包装一个对象并使用 get trap 来防止 "TypeError: Cannot read property ' b' of undefined"吗?

标签 javascript proxy ecmascript-6 get

Javascript 中,如果我尝试这样做:

var obj = {};
obj.z.c.f.d = 'foo';

`TypeError: Cannot read property 'c' of undefined`

    at repl:1:7
    at ContextifyScript.Script.runInThisContext (vm.js:50:33)
    at REPLServer.defaultEval (repl.js:240:29)
    at bound (domain.js:301:14)
    at REPLServer.runBound [as eval] (domain.js:314:12)
    at REPLServer.onLine (repl.js:442:10)
    at emitOne (events.js:121:20)
    at REPLServer.emit (events.js:211:7)
    at REPLServer.Interface._onLine (readline.js:282:10)
    at REPLServer.Interface._line (readline.js:631:8)

我不想抛出这个错误。

只需创建 z.c.f 并在其中添加 d 值。

我们有遗留代码。

现在我想将这个 obj 包装在一个代理中,并能够捕获它的方法。

如果属性未定义,则在那里创建一个对象,如果是非对象值;覆盖它。

我实现了这个方法,我可以简单地在Proxy的陷阱中使用这个方法,也许:

// setByString is not in Object.prototype. Only in my testObject
testObject.setByString('f.o.o', 1999); 
// this adds an f object and an o object inside, then an o value with 1999 to testObject. Merges deeply.

这里我的 testObject 预计只有数字、未定义、字符串、对象。

关键是我不能用代理来做。

他们似乎没有我需要的东西。

无论如何,如果不能使用代理,有没有办法做到这一点?

最佳答案

使用代理,您可以完全按照自己的意愿行事:

var handler = {
    get: function(target, name){
        if(!(name in target))
            target[name] = new Proxy({}, handler);;
        return target[name];
    }
};

var p = new Proxy({}, handler);

现在,尝试一下:

p.a.b.c = 45;//no TypeError here !!!

这是你所期望的吗?

关于javascript - 我可以在 Proxy 和 trap 中包装一个对象并使用 get trap 来防止 "TypeError: Cannot read property ' b' of undefined"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48259616/

相关文章:

javascript - 常规字符串和模板字符串之间的性能差异?

javascript - Crossfilter过滤器不过滤(dc.js)

javascript - Ajax 成功后将旧文本更改为新文本

javascript - 根据文本输入显示和隐藏 DOM 元素

selenium - 如何使用代理运行 selenium chrome 节点?

cntlm 错误 : Too many open files

javascript - 如何将列表项更改为 react 中编辑功能的输入?

javascript - 在 C# 中的每个 ajax 调用中删除带有 gif 图像的行下方的行

nginx - 当原点关闭时在重试之间添加延迟(Nginx,502)

javascript - 如何创建函数过滤器 reactjs?