对象的扩展

2021-02-23 14:32:00 浏览数 (1)

对象的扩展

属性的简洁表示法

ES6 允许直接写入变量和函数,作为对象的属性和方法。这样的书写更加简洁。

属性名表达式

JavaScript 定义对象的属性,有两种方法

方法一是直接用标识符作为属性名,方法二是用表达式作为属性名,这时要将表达式放在方括号之内

注意,属性名表达式如果是一个对象,默认情况下会自动将对象转为字符串[object Object]

方法的 name 属性

函数的name属性,返回函数名。对象方法也是函数,因此也有name属性

如果对象的方法使用了取值函数(getter)和存值函数(setter),则name属性不是在该方法上面,而是该方法的属性的描述对象的get和set属性上面,返回值是方法名前加上get和set

bind方法创造的函数,name属性返回bound加上原函数的名字;

Function构造函数创造的函数,name属性返回anonymous

如果对象的方法是一个 Symbol 值,那么name属性返回的是这个 Symbol 值的描述

Object.is()

用来比较两个值是否严格相等,与严格比较运算符(===)的行为基本一致

不同之处只有两个:一是 0不等于-0,二是NaN等于自身

Object.assign()

Object.assign方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)

如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性

如果非对象参数出现在源对象的位置(即非首参数),那么处理规则有所不同。首先,这些参数都会转成对象,如果无法转成对象,就会跳过

这意味着,如果undefined和null不在首参数,就不会报错

Object.assign拷贝的属性是有限制的,只拷贝源对象的自身属性(不拷贝继承属性),也不拷贝不可枚举的属性(enumerable: false)

Object.assign方法实行的是浅拷贝,而不是深拷贝。也就是说,如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用

浅拷贝

遇到同名属性,Object.assign的处理方法是替换,而不是添加

Object.assign可以用来处理数组,但是会把数组视为对象

Object.assign只能进行值的复制,如果要复制的值是一个取值函数,那么将求值后再复制

为对象添加属性

为对象添加方法

克隆对象

合并多个对象

为属性指定默认值

属性的可枚举性和遍历

对象的每个属性都有一个描述对象(Descriptor),用来控制该属性的行为

Object.getOwnPropertyDescriptor方法可以获取该属性的描述对象

for...in循环:只遍历对象自身的和继承的可枚举的属性。

Object.keys():返回对象自身的所有可枚举的属性的键名。

JSON.stringify():只串行化对象自身的可枚举的属性。

Object.assign(): 忽略enumerable为false的属性,只拷贝对象自身的可枚举的属性

引入“可枚举”(enumerable)这个概念的最初目的,就是让某些属性可以规避掉for...in操作,不然所有内部属性和方法都会被遍历到

属性的遍历

for...in

Object.keys(obj)

Object.getOwnPropertyNames(obj)

Object.getOwnPropertySymbols(obj)

Reflect.ownKeys(obj)

首先遍历所有数值键,按照数值升序排列。

其次遍历所有字符串键,按照加入时间升序排列。

最后遍历所有 Symbol 键,按照加入时间升序排列。

Object.getOwnPropertyDescriptors()

ES2017 引入了Object.getOwnPropertyDescriptors方法,返回指定对象所有自身属性(非继承属性)的描述对象

该方法的引入目的,主要是为了解决Object.assign()无法正确拷贝get属性和set属性的问题

__proto__属性,Object.setPrototypeOf(),Object.getPrototypeOf()

ES6 规定__proto__只有浏览器要部署,其他环境不用部署

__proto__属性(前后各两个下划线),用来读取或设置当前对象的prototype对象

Object.setPrototypeOf方法的作用与__proto__相同,用来设置一个对象的prototype对象,返回参数对象本身

该方法与Object.setPrototypeOf方法配套,用于读取一个对象的原型对象

super 关键字

ES6 又新增了另一个类似的关键字super,指向当前对象的原型对象

super关键字表示原型对象时,只能用在对象的方法之中,用在其他地方都会报错

Object.keys(),Object.values(),Object.entries()

ES5 引入了Object.keys方法,返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键名

ES2017 引入了跟Object.keys配套的Object.values和Object.entries,作为遍历一个对象的补充手段,供for...of循环使用

Object.values方法返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键值

返回数组的成员顺序

Object.values会过滤属性名为 Symbol 值的属性

Object.entries方法返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键值对数组

对象的扩展运算符

运算符(...)ES2018 将这个运算符引入了对象

对象的解构赋值用于从一个对象取值,相当于将目标对象自身的所有可遍历的(enumerable)、但尚未被读取的属性,分配到指定的对象上面

由于解构赋值要求等号右边是一个对象,所以如果等号右边是undefined或null,就会报错,因为它们无法转为对象

解构赋值必须是最后一个参数,否则会报错

0 人点赞