说我有一个对象:
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
,如果你想以后修改的属性定义(可写)在第一属性定义.
需要注意的是,当你可以去其他的方式(请写属性不可写)configurable
是false
,但毕竟是你在做什么这里相反.