我知道正确设置Javascript属性特性的方法是使用Object.defineProperty函数,但我很好奇为什么不能直接在通过Object.getOwnPropertyDescriptor返回的描述符对象上设置这些值。
var a = new Object()
a.x = 1
var attributes = Object.getOwnPropertyDescriptor(a, 'x') //Object {value: 1, writable: true, enumerable: true, configurable: true}
var attributesOfWritable = Object.getOwnPropertyDescriptor(attributes, 'writable') //Object {value: true, writable: true, enumerable: true, configurable: true}
Object.getOwnPropertyDescriptor(a, 'x').writable = false
console.log(Object.getOwnPropertyDescriptor(a, 'x')) //Object {value: 1, writable: true, enumerable: true, configurable: true}
Object.defineProperty(a, 'x', {writable: false})
console.log(Object.getOwnPropertyDescriptor(a, 'x')) //Object {value: 1, writable: false, enumerable: true, configurable: true}
如上代码所示,在查看 a.x 原始描述符对象的 'writable' 属性时,该属性是可写和可配置的,这意味着设置属性描述符的 'writable' 属性并没有改变底层的 x 属性。因此,我不确定为什么不能只写:
Object.getOwnPropertyDescriptor(a, 'x').writable = false