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