ECMAScript 6 笔记(10)- 对象的扩展(1)

原创 乘风逐月 随笔 ES6 131阅读 2018-09-03 16:16:27 举报

阅读原文: 阮一峰:ECMAScript 6 入门

一、属性的简洁表示法

ES6允许直接写入变量和函数,作为对象的属性和方法。

1.对象属性名简洁表示

上例中,对象的属性名是变量名,属性值是变量值。

2.对象方法简洁表示

这种写法用于函数的返回值,也非常方便。
注意问题:
(1)简洁写法的属性名总是字符串,这会导致一些看上去比较奇怪的结果。

上例中 class 是字符串,所以不会因为它属于关键字,而导致语法解析报错。
(2)如果某个方法的值是一个 Generator 函数,前面需要加上星号。

二、表达式定义属性名方法名

ES5 中,在字面量方式定义对象时,属性名只能用标识符,不能用表达式。
ES6 允许字面量定义对象时,用表达式作为对象的属性名,即把对象放在方括号内。

1.表达式定义属性名

注意:
(1)属性的赋值器(setter)和取值器(getter),事上也是采用这种写法。

(2)属性名表达式与简洁写法不能同时使用,会报错。

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

2.表达式定义方法

三、方法的 name 属性

函数的 name 属性返回函数名。对象的方法也是函数,也有 name 属性,返回方法名(即函数名)。

1.getter 和 setter 函数的 name

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

2.bind 方法创造的函数的 name

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

3.Function 构造函数创造的函数name

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

4.对象方法是一个 Symbol 值

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

四、Object.is()

ES5 比较两个值是否相等,只有两个运算符: 相等运算符(==)和严格相等运算符(===)。它们都有缺点:前者会自动转化数据类型,后者的 NaN 不等于自身,以及 +0 等于 -0。
JavaScript 缺乏一种运算,在所有环境中,只要两个值是一样的,它们就应该相等。ES6 提出 “Same-value equality” (同值相等) 算法,用来解决这个问题。
Object.is 就是部署这个算法的新方法。它用来比较两个值严格相等,与严格比较运算符(===)的行为基本一致。
不同之处在于:
(1) +0 不等于 -0
(2) NaN 等于自身

五、Object.assign()

1.基本用法

Object.assign 方法用于对象的合并,将源对象的所有可枚举属性,复制到目标对象。
Object.assign 方法的第一个参数是目标对象,后面的参数都是源对象。

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

如果只有一个参数,Object.assign 会直接返回该参数。如果该参数不是对象,则会先转成对象,返回。undefined 和 null 无法转成对象,所以如果它们作为首参数,就会报错。
如果源对象位置的参数不是对象,这些参数会都转成对象,如果无法转成对象就会跳过。故 undefined 和 null 不在首参数不会报错。

如果源对象位置的参数是字符串,会以数组的形式,拷贝入目标对象。这是因为只有字符串的包装对象,会产生可枚举属性。而布尔值、数值转换成包装对象,它们的原始值都在包装对象的内部属性[[OrimitveValue]]上面,这个属性不会被 Object.assign 拷贝。

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

属性名为Symbol 值的属性,也会被拷贝。

2.注意问题:

(1)浅拷贝
Object.assign 方法实行的是浅拷贝,而不是深拷贝。即,如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用。源对象的任何变化,都会反映到目标对象上。

(2)同名属性的替换
对于这种嵌套的对象,一旦遇到同名属性,Object.assign 的处理方法是替换,而不是添加。

(3)数组的处理
Object.assgin 可以处理数组,但是会把数组视为对象。

上例中,Object.assgin 把数组视为属性名为 0、1、2的对象,因此源数组的0号属性4覆盖了目标数组的0号属性1。
(4)取值函数的处理
Object.assgin 只能进行值的复制,如果要复制的值是一个取值函数,那么将求值后再复制。

3.常见用途

(1)为对象添加属性

上例中,将属性 x 和 y 添加到 Point 类对象的实例中。
(2)为对象添加方法

上例中,使用了对象属性的简洁表示法,直接将两个函数放在大括号中,添加到 SomeClass.prototype 中。
(3)克隆对象

上例中,将源对象拷贝到一个空对象,得到源对象的克隆。但是这种方法克隆,只能克隆源对象自身的值,不能克隆它的继承值。如果想保持继承链,可以采用以下代码:

(4)合并多个对象
将多个对象合并到某个对象:

将多个对象合并到一个空对象:

(5)为属性指定默认值

评论 ( 0 )
最新评论
暂无评论

赶紧努力消灭 0 回复