属性描述符

182 阅读2分钟
自身可枚举属性组成的数组
  1. writable 是否可以修改属性的值
let obj = {}
Object.defineProperty(obj, "a", {
    value: 1,
    writable: false, // 不可写
    configurable: true,
    enumerable: true
})
obj.a = 3 // obj: { a: 1 } 严格模式会报错
  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 会禁止删除这个属性
  1. 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) 返回一个数组,包含所有属性,无论是否可以枚举
  1. value 属性对应的值,默认为 undefined

  2. Get:给属性提供 getter 方法,默认为 undefined

  3. 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
  • 自有属性指的是直接赋予给对象的属性,不需要从原型链上进行查找