继承对象上的Javascript Proxy set()本地属性
根据,,继承对象上的Javascript Proxy set()本地属性,javascript,inheritance,proxy,Javascript,Inheritance,Proxy,根据,, handler.set()可以捕获继承的属性分配: Object.create(proxy)[foo] = bar; 在这种情况下,如何在继承的对象上监视和允许本地分配 var基={ foo:function(){ 返回“foo”; } } var proxy=新代理(基本{ 集合:函数(目标、属性、值、接收者){ log(“调用:“+property+”=“+value”,“on”,“receiver”); //receiver[property]=value;//无限循环!?!
handler.set()
可以捕获继承的属性分配:
Object.create(proxy)[foo] = bar;
在这种情况下,如何在继承的对象上监视和允许本地分配
var基={
foo:function(){
返回“foo”;
}
}
var proxy=新代理(基本{
集合:函数(目标、属性、值、接收者){
log(“调用:“+property+”=“+value”,“on”,“receiver”);
//receiver[property]=value;//无限循环!?!?!?!?!
//target[property]=value//这是不正确的->它将在基础上设置属性。
/*
在这里填写代码。
*/
返回true;
}
})
var继承={}
setPrototypeOf(继承,Object.create(代理));
inherited.bar=函数(){
返回“bar”;
}
//测试用例
console.log(base.foo)//函数foo
console.log(base.bar)//未定义
console.log(inherited.hasOwnProperty(“bar”)//true
我看到两个选项(可能):
映射
中,将不同接收器的映射
保存在接收器键入的WeakMap
中。通过检查Map
并在那里而不是从对象返回映射,满足get
。(还有有
)一个小问题是,为了处理自己的密钥
,您还需要代理接收者(而不仅仅是base
)。所以这可能是行不通的var基={
foo:function(){
返回“foo”;
}
};
var proxy=新代理(基本{
集合:函数(目标、属性、值、接收者){
const p=Object.getPrototypeOf(receiver);//***
Object.setPrototypeOf(receiver,null);//***
接收方[属性]=值;//***
Object.setPrototypeOf(receiver,p);//***
返回true;
}
});
var继承={};
setPrototypeOf(继承,Object.create(代理));
inherited.bar=函数(){
返回“bar”;
};
//测试用例
console.log(“base.foo:,base.foo);//函数foo
console.log(“base.bar:,base.bar);//未定义
console.log(“inherited.bar:”,inherited.bar);//功能条
console.log(“继承的有自己的酒吧?”,继承的.hasOwnProperty(“酒吧”);//真的
经过一些额外的思考,我注意到它拦截了3个操作:
属性分配:proxy[foo]=bar和proxy.foo=bar
继承的属性分配:Object.create(proxy)[foo]=barReflect.set() 但这似乎比=运算符的级别更低 因此,以下工作:
var基={
foo:function(){
返回“foo”;
}
};
var proxy=新代理(基本{
集合:函数(目标、属性、值、接收者){
var p=Object.getPrototypeOf(接收方);
Object.defineProperty(接收者,属性,{value:value});//***
返回true;
}
});
var继承={};
setPrototypeOf(继承,Object.create(代理));
inherited.bar=函数(){
返回“bar”;
};
//测试用例
console.log(base.foo);//函数foo
console.log(base.bar);//未定义
console.log(继承的.bar);//功能条
console.log(inherited.hasOwnProperty(“bar”)//true
对不起,我想到了另一个使用Object.defineProperty()的答案。如果代理抓住的东西没有漏洞,我想你的答案会是最好的。@Blacking:毫无疑问,你的答案是更好的。我为什么没想到呢?!:-)你可能想要writable:true,enumerable:true,configurable:true
,使其等效。你的评论帮我找到了一个bug。不知道enumerable(和所有其他属性)在默认情况下为false