6.1 理解对象

创建自定义对象最简单的方法,创建一个 Object 的实例,然后为它添加属性和方法。

let obj = new Object();
obj.name = 'wendy';
obj.age = 18;
obj.sayName = function() {
  console.log(this.name);
}
// 或者 用对象字面量来创建
let obj = {
  name: 'wendy',
  age: 18,
  sayName() {
    console.log(this.name);
  }
};

6.1.1 属性类型

两种属性:

  • 数据属性
  • 访问器属性

1、数据属性

数据属性包含一个数据值的位置,在这个位置可以读取和写入。

数据属性有 4 个描述其行为的特性。

  • [[Configurable]]
  • [[Enumberable]]
  • [[Writable]]
  • [[Value]]

要修改属性默认的特性,需要用 Object.definedProperty() 方法。

console.log(Object.getOwnPropertyDescriptor(obj, 'name'));
// {value: "wendy", writable: true, enumerable: true, configurable: true}

// 设置为不可写
Object.defineProperty(obj, 'name', {
  writable: false,
  value: 'wendy',
});
// 修改 name 属性的值
obj.name = 'W';
console.log(obj.name); // wendy <-- name 属性的值没有被修改掉

2、访问器属性

访问器属性不包含数据值,包含一对 getter 和 setter 函数。

访问器属性的特性:

  • [[Configurable]]
  • [[Enumerable]]
  • [[Get]]
  • [[Set]]

访问器属性只能通过 Object.defineProperty() 来定义。

const book = {
  _year: 2004, // 私有属性,只能通过对象方法访问
  edition: 1,
};

Object.defineProperty(book, 'year', {
  get() {
    return this._year;
  },
  set(value) {
    if (value > 2004) {
      this._year = value;
      this.edition += value - 2004;
    }
  },
});

book.year = 2019;
console.log(book); // {_year: 2019, edition: 16, year: 2019}

6.1.2 定义多个属性

通过 Object.defineProperties() 实现。

let book = {};
Object.defineProperties(book, {
  _year: {
    value: 2004,
    writable: true,
  },
  edition: {
    value: 1,
    writable: true,
  },
  year: {
    get() {
      return this._year;
    },
    set(value) {
      if (value > 2004) {
        this._year = value;
        this.edition += value - 2004;
      }
    },
  },
});
console.log(book); // {_year: 2004, edition: 1}
book.year = 2019;
console.log(book); //{_year: 2019, edition: 16}

6.1.3 读取属性的特性

Object.getOwnPropertyDescriptor()

ES6 新增 Object.getOwnPropertyDescriptors()

Last Updated: 7/22/2019, 4:57:35 PM