属性的类型
- 数据属性
- [[Configurable]]: 能否通过delete删除此属性,能否修改属性的特征
- [[Enumerable]]: 该属性是否可枚举,即是否可通过for-in或Object.keys()返回属性
- [[Writable]]: 能否修改属性的值
[[Value]]: 该属性的值,默认为undefined
访问器属性
- [[Configurable]]、[[Enumerable]] 和数据属性一致
- [[Get]]: 提供一个 getter 方法,访问对象属性时会调用该方法
- [[Set]]: 提供一个 setter 方法,读取对象属性时会调用该方法
定义或修改属性
Object.defineProperty: 定义或修改一个对象中的属性
Object.defineProperties: 定义或修改一个对象中的多个属性
Object.getOwnPropertyDescriptor: 获取一个对象中的一个属性描述(2个参数:对象名称,对象属性)
Object.getOwnPropertyDescriptors: 获取一个对象中的所有属性描述(1个参数:对象名称)
Object.defineProperty 配置一个属性后 就不可再次配置了 在次调用**Object.defineProperty修改会报错 但没有设置过的 可以再次设置(js高级书)// defineProperty
const obj = new Object()
Object.defineProperty(obj, 'name', {
configurable: false,
writable: false,
enumerable: true,
value: '不能修改'
})
console.log(obj.name) // '不能修改'
obj.name = "Tom"
console.log(obj.name) // '不能修改' 非严格 新赋值会被忽略,严格模式下 会抛出错误
```javascript // defineProperties const obj2 = new Object() Object.defineProperties(obj2, { name: { writable: true, value: ‘张三’ }, nickName: { get: function() {
}, set: function(value) {return `${this.name}先生` //获取时会加上先生
} } }) console.log(obj2.name) // 张三 console.log(obj2.nickName) // 张三先生 obj2.nickName = ‘’ console.log(obj2.name) // 未知 console.log(obj2.nickName) //未知先生 // getOwnPropertyDescriptor //获取属性描述 Object.getOwnPropertyDescriptor(obj2, ‘name’) // / {value: “未知”, writable: true, enumerable: false, configurable: false} configurable: false enumerable: false value: “未知” writable: true / Object.getOwnPropertyDescriptors(obj2) //返回一个新对象 / {name: {…}, Name: {…}} sayName: {enumerable: false, configurable: false, get: ƒ, set: ƒ} name: {value: “未知”, writable: true, enumerable: false, configurable: false} proto: Object /this.name = value || '未知' //如果不传为空则用未知代替
<a name="1c8d72d0"></a>
### 计算属性
对象属性可以通过表达式计算定义,这在动态设置属性或执行属性方法时很好用。
```javascript
let id = 0;
const user = {
[`id-${id++}`]: id,
[`id-${id++}`]: id,
[`id-${id++}`]: id
};
console.log(user); //{id-0: 1, id-1: 2, id-2: 3}