据我了解,如果可配置设置为false,则属性描述符无法更改(不允许重新定义)。
但是当我在chrome,node,firefox,safari中进行测试时,我得到的结果是相同的:
o = {}
Object.defineProperty(o, 't', {writable: true, configurable: false})
Object.defineProperty(o, 't', {writable: false, configurable: false}) // descriptor changes without error
Object.defineProperty(o, 't', {writable: true, configurable: false})
// this time I got expected error - TypeError: Attempting to change writable attribute of unconfigurable property.
似乎当writable为true,即使configurable为false时,我们仍然可以更改属性描述符。
或者,始终允许将描述符更改为false?
什么是正确的行为?
最佳答案
configurable
做什么is:
当且仅当此属性描述符的类型可以更改并且该属性可以从相应对象中删除时,才返回true。
并查看:
对象中存在的属性描述符有两种主要形式:数据描述符和访问器描述符。数据描述符是具有值的属性,该值可以写也可以不写。访问器描述符是由一对getter-setter函数描述的属性。描述符必须是这两种形式之一。不能两者兼有。
属性描述符的类型指的是该描述符是数据描述符(对其有意义的值)还是访问者描述符(具有getter / setter方法)。无法将不可配置的属性从数据类型更改为getter / setter类型,反之亦然。
const o = {};
Object.defineProperty(o, 't', {writable: true, configurable: false})
console.log(Object.getOwnPropertyDescriptor(o, 't'));
Object.defineProperty(o, 't', { get() { }})
如果传递
writable
键,则描述符类型默认为数据描述符,如果未传递undefined
,则其值为value
。您最后看到的错误是不同的。尽管您可以将可写的不可配置数据描述符更改为不可写的数据描述符,但是您无法进行其他操作-无法将不可写的,不可配置的数据描述符转换为可写的数据描述符。 (请参见ValidateAndApplyPropertyDescriptor的步骤7)
关于javascript - 如何解决Object.defineProperty的可配置问题?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58249804/