1. 概念
JavaScript 提供了一个内部数据结构,用来描述对象的属性,控制它的行为,比如该属性是否可写、可遍历等等。这个内部数据结构称为“属性描述对象”(attributes object)。每个属性都有自己对应的属性描述对象,保存该属性的一些元信息。
2. 六个元属性
属性 | 含义 | 数据类型 | 默认值 |
---|---|---|---|
value | 该属性的属性值(writable或configurable时可修改) | undefined | |
writable | value是否可以改变 严格模式下修改writable为false的属性的value会报错 | Boolean | true |
enumerable | 该属性是否可以遍历(枚举)JSON.stringify() | Boolean | true |
configurable | 属性是否可改写或删除(delete)(为false时,writable可以改为false) | Boolean | true |
get | 该属性的取值函数 | function | undefined |
set | 该属性的存值函数 | function | undefined |
获取对象的属性
对比 | |
---|---|
Object.keys(obj) | 获取对象的可枚举属性,不包括继承的属性 |
Object.getOwnPropertyNames(obj) | 获取对象本身的属性和继承的属性 |
获取属性描述对象
Object.getOwnPropertyDescriptor(obj, ‘property’)// 第一个参数为对象,第二个参数为属性
PS: 只获取对象自身的属性的属性描述对象
3. 定义/修改属性
对比 | |
---|---|
Object.defineProperty(obj, propertyName, attributeObject) | 接收三个参数:对象,参数名,属性描述对象 |
Object.defineProperties(obj, { property1: { attributeObject }, …}) | 接收两个参数: 对象, 属性与属性描述对象的集合对象 |
4. 判断属性是否可以遍历
Object.prototype.propertyIsEnumerable(propertyName)//属性名需要加单引号
仅限于对象自身的属性,对于继承的属性一律返回false
5. 存取器
除了直接定义以外,属性还可以用存取器(accessor)定义。其中,存值函数称为
setter
,使用属性描述对象的set
属性;取值函数称为getter
,使用属性描述对象的get
属性。
通过get/set方法可以实现属性的改写操作
- 当取值时调用get方法
- 当改值时调用set方法
set(val)
var obj ={
get p () {},
set p(val) {}
};
obj.p // "getter"
obj.p = 123 // "setter: 123"
此文章为学习笔记,感谢指正
参考链接