自身可枚举属性组成的数组
- writable 是否可以修改属性的值
let obj = {}
Object.defineProperty(obj, "a", {
value: 1,
writable: false, // 不可写
configurable: true,
enumerable: true
})
obj.a = 3 // obj: { a: 1 } 严格模式会报错
- configurable 属性是否可以配置,若可配置,可以使用 defineProperty 修改属性描述符
let obj = {a: 1}
obj.a = 2
// obj: {a: 2}
Object.defineProperty(obj, "a", {
value: 3,
writable: true,
configurable: false, // 不可配置
enumerable: true
})
// obj: {a: 3}
obj.a = 4 // obj : { a: 4}
Object.defineProperty(obj, "a", {
value: 5,
writable: true,
configurable: true,
enumerable: true
})
// Uncaught TypeError: Cannot redefine property: a at Function.defineProperty
注意:
- configurable 属性修改成 false 是单向操作,不允许撤销
- 即使是 configurable: false,可以把 writable: true 修改为 writable: false, 但是不能从 false 改为 true
- configurable: false 会禁止删除这个属性
- enumerable 是否出现在对象的属性枚举中 (eg: 若 enumerable: false ,在 for ... in 中就不会出现,但是还是可以正常访问 )
let obj = {}
Object.defineProperty(obj, "a", {
value: 1,
enumerable: true // 可以枚举
})
Object.defineProperty(obj, "b", {
value: 2,
enumerable: false // 不可枚举
})
obj.b // 2
("b" in obj) // true
obj.hasOwnProperty("b") // true
Object.prototype.hasOwnProperty.call(obj, "b")
// 某些情况某些对象没有连接到Object.prototype
obj.propertyIsEnumerable("a") // true
obj.propertyIsEnumerable("b") // false
for(const k in obj) {
console.log(k, obj[k]) // a, 1
}
注意:
- in 操作符会检查属性是否存在对象及其 [[prototype]] 原型链中
- hasOwnproperty(属性名) 只检查是否存在对象中
- propertyIsEnumerable(属性名) 会检查给定的属性名是否直接存在于对象中并且 enumerable: true
- Object.keys(对象) 返回一个数组(自身可枚举属性组成的数组),只包含可枚举属性
- Object.getOwnPropertyNames(obj) 返回一个数组,包含所有属性,无论是否可以枚举
-
value 属性对应的值,默认为 undefined
-
Get:给属性提供 getter 方法,默认为 undefined
-
Set:给属性提供 setter 方法,默认为 undefined 注意:如果对象指定了属性值,不要设置 Get 和 Set
相关方法
Object.defineProperty(obj, prop, descriptor)
Object.defineProperties(obj, props)
Object.getOwnPropertyDescriptor(obj, prop) // 返回指定对象一个自有属性对应的属性描述符
Object.getOwnPropertyDescriptors(obj)
注意:
- 如果对象属性由 Object.defineProperty(obj, prop, descriptor) 或者 Object.defineProperties(obj, props) 定义, 则 writable configurable enumerable 均默认为 false ,
- 如果对象属性是由赋值操作定义的, 则 writable configurable enumerable 均为 true
- 自有属性指的是直接赋予给对象的属性,不需要从原型链上进行查找