JavaScript 属性描述符
属性描述符(Property Descriptor)是 ES5 之后出现的概念,顾名思义,它用于描述属性应该是什么样,例如是否只读,能否枚举,能否可配置等。所有对象属性均可使用属性描述符来定义。
属性描述符的六个属性
-
value
- 属性值。
-
writable
- 是否允许赋值,true 表示允许,否则该属性不允许赋值。
-
get
- 返回属性值的函数。如果为 undefined 则直接返回描述符中定义的 value 值。
-
set
- 属性的赋值函数。如果为 undefined 则直接将赋值运算符右侧的值保存为属性值。
-
configurable
- 如果为 true,则表示该属性可以重新定义描述符,或者从属性的宿主删除。缺省为
true
。
- 如果为 true,则表示该属性可以重新定义描述符,或者从属性的宿主删除。缺省为
-
enumerable
- 如果为 true,则表示遍历宿主对象时,该属性可以被遍历到。缺省为
true
。
- 如果为 true,则表示遍历宿主对象时,该属性可以被遍历到。缺省为
Object 操作属性的方法
-
Object.defineProperty(obj, prop, descriptor)
- 使用描述符 descriptor 定义 obj 的 prop 属性。
-
Object.getOwnPropertyDescriptor(obj, prop)
- 获取 obj 的 prop 属性描述符。
-
Object.preventExtensions(obj)
- 禁止为当前对象 obj 添加新属性。
-
Object.seal(obj)
- 封印当前对象 obj,禁止添加新属性,并且将所有现有属性 configurable 设置为 false。
-
Object.freeze(obj)
- 冻结当前对象 obj,禁止增加新属性,禁止删除现有属性或修改属性描述符,相当于将该 obj 变成了 immutable。
-
Object.isExtensible(obj)
- 判断当前对象 obj 是否允许扩展。
-
Object.isSealed(obj)
- 判断当前对象 obj 是否被封印。
-
Object.isFrozen(obj)
- 判断当前对象 obj 是否被冻结。
-
Object.prototype.hasOwnProperty(prop)
- 判断当前对象是否拥有 prop 属性。