Javascript 使用代理创建不可配置的动态属性

Javascript 使用代理创建不可配置的动态属性,javascript,ecmascript-6,es6-proxy,Javascript,Ecmascript 6,Es6 Proxy,我想使用代理创建不可配置的动态属性。我试过这个: constproxy=newproxy({}{ getOwnPropertyDescriptor(){ 返回{ 可配置:false, 可枚举:false, }; }, }); log(Reflect.getOwnPropertyDescriptor(代理,“test”)不是真的。这是由于理想的不变量,如果观察对象中的不可配置属性,它不会神奇地消失。如果它也是不可写的,则其值不能更改 如果您不能依赖于此,getOwnPropertyDescrip

我想使用代理创建不可配置的动态属性。我试过这个:

constproxy=newproxy({}{
getOwnPropertyDescriptor(){
返回{
可配置:false,
可枚举:false,
};
},
});

log(Reflect.getOwnPropertyDescriptor(代理,“test”)不是真的。这是由于理想的不变量,如果观察对象中的不可配置属性,它不会神奇地消失。如果它也是不可写的,则其值不能更改

如果您不能依赖于此,
getOwnPropertyDescriptor
基本上是无用的

强制您不要使用不可配置的属性,或者在目标中定义它们,这意味着您不会违反此不变量,因为不变量通过构造在目标上保持不变。也就是说,ECMAScript不允许您以破坏这些不变量的方式使用代理定制

中定义的一些内部方法不变量是 基本完整性不变量。这些不变量是显式的 由此中指定的代理对象内部方法强制执行 节。ECMAScript实现在存在时必须是健壮的 所有可能的不变冲突

因此,要么将属性报告为可配置属性,要么在目标中定义不可配置属性


如果你想要动态属性,我建议你说这个属性是可配置的。然后添加一个
defineProperty
陷阱,该陷阱返回
false
,有效地防止了重新定义。

如果在
getOwnPropertyDescriptor
陷阱中,我在返回描述符之前在目标对象上定义了该属性,那么它工作正常

constproxy=newproxy({}{
getOwnPropertyDescriptor(目标,属性){
常量描述符={
可配置:false,
可枚举:false,
};
定义属性(目标、属性、描述符);
返回描述符;
},
});

log(Reflect.getOwnPropertyDescriptor(代理,“test”)很好的解释,谢谢。你觉得我的解决方案如何(以自我回答的形式发布)?有没有我没想到的副作用?@Gothdo是的,应该可以正常工作。您可能会在使用其他代理或不可扩展对象等更通用的目标时遇到问题,但是如果您使用
{}
并且不将其暴露于其他代码中,我看不出有任何问题。