继承对象上的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]=bar
    Reflect.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