1.在ES5
之前,JavaScript语言本身并没有提供可以直接检测属性特性的方法,比如判断属性是否可读。
2.如何获得一个属性的描述符,或者属性的描述符有哪些?
let obj = {
a: 1,
obj2: {
b: 2
}
}
Object.getOwnPropertyDescriptor(obj, 'a')
用Object.getOwnPropertyDescriptor(obj, 'a')
该方法获取属性描述符,有四个:
configurable: true
enumerable: true
value: 1
writable: true
3.如何修改已有属性,或者添加一个新属性呢?
用Object.defineProperty()
Object.defineProperty(obj, 'a', {
configurable: false,
writable: false,
enumerable: false
})
只要属性是可配置的,即configurable: true
。就可以使用Object.defineProperty()
来修改属性描述符。
注意:当属性初始描述符configurable: false
时,再次定义,有以下几点注意:
1.configurable: false
为单向操作,无法撤销。即,无法再变为true。
2.该属性不可删除。
3.属性描述符writable可以由true更改为false,但不能反过来。enumerable不能由true改为false,反过来也不行。
4.当writable = true
时,数据值value
,可以修改。
5.很重要的一点,所有的方法创建都是浅不变性。它们只会影响目标对象和它的直接属性。如果有属性值为对象的。其内容仍然是可变的。
属性的可枚举性
1.该描述符控制属性是否出现在对象的属性枚举中,即是否可用for...in
遍历到该属性。
另外,当一个对象的属性直接用Object.defineProperty()
来定义时,若只定义了value值,那么其他的属性描述符的值都为false。
例子:
const obj = {
}
Object.defineProperty(obj, 'name', {
value: 'cst'
})
obj.name = 'ha';
console.log(obj.name); // cst
用Object.getOwnPropertyDescriptors(obj)
来查看。
若是用对象字面量定义时,则为true。
const obj = {
name: 'cst'
}
obj.name = 'ha';
console.log(obj.name); // ha