红宝书——08.对象、类与面向对象编程01

ECMA-262 将对象定义为一组属性的无序集合。可以把 ECMAScript 的对象想象成一张散列表,其中的内容就是一组名/值对,值可以是数据或者函数。

一.理解对象

1.属性的类型

分为数据属性和访问器属性

数据属性

据属性有 4个特性描述它们的行为。
 [[Configurable]] :表示属性是否可以通过 delete 删除并重新定义,是否可以修改它的特性,以及是否可以把它改为访问器属性。默认情况下,所有直接定义在对象上的属性的这个特性都是true 
 [[Enumerable]] :表示属性是否可以通过 for-in 循环返回。默认情况下,所有直接定义在对象上的属性的这个特性都是 true ,如前面的例子所示。
 [[Writable]] :表示属性的值是否可以被修改。默认情况下,所有直接定义在对象上的属性的这个特性都是 true ,如前面的例子所示。
 [[Value]] :包含属性实际的值。这就是前面提到的那个读取和写入属性值的位置。这个特性的默认值为 undefined 。

要修改属性的默认特性,就必须使用 Object.defineProperty() 方法。这个方法接收 3 个参数:
要给其添加属性的对象、属性的名称和一个描述符对象。let person = {};
Object.defineProperty(person, "name", {
        writable: false,
        value: "Nicholas"
}
);
console.log(person.name); // "Nicholas"
person.name = "Greg";
console.log(person.name); // "Nicholas"

访问器属性

访问器属性不包含数据值。它们包含一个获取(getter)函数和一个设置(setter)函数。

访问器属性有 4 个特性描述它们的行为。
 [[Configurable]] :表示属性是否可以通过 delete 删除并重新定义,是否可以修改它的特性,以及是否可以把它改为数据属性。默认情况下,所有直接定义在对象上的属性的这个特性都是 true 
 [[Enumerable]] :表示属性是否可以通过 for-in 循环返回。默认情况下,所有直接定义在对象上的属性的这个特性都是 true 。
 [[Get]] :获取函数,在读取属性时调用。默认值为 undefined 。
 [[Set]] :设置函数,在写入属性时调用。默认值为 undefined 。

// 定义一个对象,包含伪私有成员 year_和公共成员 edition
let book = {
year_: 2017,
edition: 1};
Object.defineProperty(book, "year", {
        get() {
        return this.year_;
        },
        set(newValue) {
                if (newValue > 2017) {
                this.year_ = newValue;
                this.edition += newValue - 2017;
                }
        }
});
book.year = 2018;
console.log(book.edition); // 2

2.读取属性

使用 Object.getOwnPropertyDescriptor() 方法可以取得指定属性的属性描述符。这个方法接收两个参数:属性所在的对象和要取得其描述符的属性名。返回值是一个对象。

3.合并对象

 Object.assign() 方法。这个方法接收一个目标对象和一个或多个源对象作为参数,然后将每个源对象中可枚举( Object.propertyIsEnumerable() 返回 true)和自有( Object.hasOwnProperty() 返回 true )属性复制到目标对象。

let dest, src, result;
/**
* 简单复制
*/
dest = {};
src = { id: 'src' };
result = Object.assign(dest, src);
// Object.assign 修改目标对象
// 也会返回修改后的目标对象
console.log(dest === result); // true 
console.log(dest !== src); // true   只是复制了其属性值,但dest和src并不是指向同一个对象
console.log(result); // { id: src }
console.log(dest); // { id: src }       

4.对象解构

可以在一条语句中使用嵌套数据实现一个或多个赋值操作。简单地说,对象解构就是使用与对象匹配的结构来实现对象属性赋值。

// 使用对象解构
let person = {
        name: 'Matt',
        age: 27
};
let { name: personName, age: personAge } = person;
console.log(personName); // Matt
console.log(personAge); // 27

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值