属性的类型

  • 数据属性
  • [[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个参数:对象名称)

    1. // defineProperty
    2. const obj = new Object()
    3. Object.defineProperty(obj, 'name', {
    4. configurable: false,
    5. writable: false,
    6. enumerable: true,
    7. value: '不能修改'
    8. })
    9. console.log(obj.name) // '不能修改'
    10. obj.name = "Tom"
    11. console.log(obj.name) // '不能修改' 非严格 新赋值会被忽略,严格模式下 会抛出错误
    Object.defineProperty 配置一个属性后 就不可再次配置了 在次调用**Object.defineProperty修改会报错 但没有设置过的 可以再次设置(js高级书)
    ```javascript // defineProperties const obj2 = new Object() Object.defineProperties(obj2, { name: { writable: true, value: ‘张三’ }, nickName: { get: function() {
    1. return `${this.name}先生` //获取时会加上先生
    }, set: function(value) {
    1. this.name = value || '未知' //如果不传为空则用未知代替
    } } }) 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 /
  1. <a name="1c8d72d0"></a>
  2. ### 计算属性
  3. 对象属性可以通过表达式计算定义,这在动态设置属性或执行属性方法时很好用。
  4. ```javascript
  5. let id = 0;
  6. const user = {
  7. [`id-${id++}`]: id,
  8. [`id-${id++}`]: id,
  9. [`id-${id++}`]: id
  10. };
  11. console.log(user); //{id-0: 1, id-1: 2, id-2: 3}