Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我是否可以将对象包装在代理和陷阱中,并使用get-trap防止“TypeError:无法读取未定义的属性“b”?_Javascript_Proxy_Ecmascript 6_Get - Fatal编程技术网

Javascript 我是否可以将对象包装在代理和陷阱中,并使用get-trap防止“TypeError:无法读取未定义的属性“b”?

Javascript 我是否可以将对象包装在代理和陷阱中,并使用get-trap防止“TypeError:无法读取未定义的属性“b”?,javascript,proxy,ecmascript-6,get,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 (

在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 testObject={}; setByStringtestObject,“f.o.o.,1999年; console.logtestObject; 函数setByStringobj,props,val{ 无功电流=obj; props.split'.。forEachprop,index,self=>{ 当前[prop]=index!==self.length-1?当前[prop]|{}:val; 电流=电流[prop]; }; } 试试这个

var testObject={}; setByStringtestObject,“f.o.o.,1999年; console.logtestObject; 函数setByStringobj,props,val{ 无功电流=obj; props.split'.。forEachprop,index,self=>{ 当前[prop]=index!==self.length-1?当前[prop]|{}:val; 电流=电流[prop]; };
} 有了代理,您就可以完全完成您想要的任务:

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 !!!

这是您所期望的吗?

使用代理,您可以完全按照您的要求执行:

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中是否可能与代理等类似?我可以在没有字符串的情况下这样做吗?这在Javascript中是否可能与代理等类似?当我使用util.inspectp时,{depth:null,colors:true},我得到:RangeError:formatValue util.js:423:37处formatProperty util.js:833:11处formatValue util.js:612:17处formatProperty util.js:833:11处formatValue util.js:612:17处formatProperty util.js:833:11处formatValue util.js:612:17处formatProperty util:833:11处formatValue util.js:612:17在formatProperty util.js:833:11这正是我所期望的。但这里可能有一个类似循环的问题。还说console.logJSON.parseJSON.stringifyp;给出相同的调用堆栈错误。不要尝试JSONify代理!!!也许这个函数就是您想要返回对象的函数:JSON.proxyToJSON=functionp{let result={};if typeof p!=object返回p;for prop in p{result[prop]=JSON.proxyToJSONp[prop];}返回结果;}到目前为止非常好。现在,我可以将这个处理程序更改为set,这样我就可以根据需要设置任何属性,并且当我调用这个属性时,我总是会得到一个对象。不需要。如果不可能,忽略示例:obj.a.b.c=13;console.logobj/{a:{b:{c:13}}};。。。obj.a.b.c=13相当于setobj,a,b,c,13…当我使用util.inspectp,{depth:null,colors:true},我得到:RangeError:formatValue util.js:423:37处formatProperty util.js:833:11处formatValue util.js:612:17处formatProperty util.js:833:11处formatValue util.js:612:17处formatProperty util.js:833:11处formatValue util.js:612:17处formatProperty util:833:11处formatValue util.js:612:17在formatProperty util.js:833:11这正是我所期望的。但这里可能有一个类似循环的问题。还说console.logJSON.parseJSON.stringifyp;给出相同的调用堆栈错误。不要尝试JSONify代理!!!也许这个函数就是您想要返回对象的函数:JSON.proxyToJSON=functionp{let result={};if typeof p!=object返回p;for prop in p{result[prop]=JSON.proxyToJSONp[prop];}返回结果;}到目前为止非常好。现在,我可以将这个处理程序更改为set,这样我就可以根据需要设置任何属性,并且当我调用这个属性时,我总是会得到一个对象。不需要。如果不可能,忽略示例:obj.a.b.c=13;console.logobj/{a:{b:{c:13}}};。。。obj.a.b.c=13相当于setobj,a,b,c,13。。。