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()