使现有的不可写和不可配置属性可写和可配置

Make existing non-writable and non-configurable property writable and configurable

本文关键字:配置 属性      更新时间:2023-09-26

假设我有一个对象:

var agent = new Agent({name: 'James', type: 'secret', id: 007})

当我构建Agent类时,我决定使id属性不可变:

Object.defineProperty(Agent.prototype, 'id', {
    configurable: false,
    writable: false
})

但在某个时刻,我会想将该对象标记为删除。因为我们实际上无法删除this,所以我将通过删除id属性来削弱对象。所以我再次使属性可写:

Object.defineProperty(agent, 'id', {
    configurable: true,
    writable: true
})
delete agent.id

但我当然明白:

TypeError: Cannot redefine property: id 

因为id已经存在。

如何使现有的不可写属性可写?

Mozilla文档显示

当属性已经存在时,Object.defineProperty()尝试根据描述符中的值和对象的当前配置。如果旧描述符可配置属性设置为false(据说属性为"不可配置"),则除了可写之外,任何属性都不能已更改。如果属性不可配置,则其可写属性可以只能更改为false。

换句话说,如果以后要修改特性定义(使其可写),则必须在第一个特性定义中将configurable设置为true

请注意,当configurablefalse时,您可以采用另一种方式(使可写属性不可写),但这与您在这里所做的相反。