4.扩展对象的功能性
4.1 对象类别
- 普通对象:具有JavaScript对象所有的默认内部行为。
- 特异对象:具有某些与默认行为不符的内部行为。
- 标准对象:ES6规范中定义的对象,例如Array,Date等。标准对象既可以是普通对象,也可以是特异对象。
- 内建对象:脚本开始执行时存在于JavaScript执行环境中的对象,所有的标准对象都是内建对象。
4.2 对象字面量语法扩展
属性初始值的简写
当一个对象的属性与本地变量同名时,不必在写冒号与值,简单只写属性名即可。当对象字面量里只有一个属性的名称时,JavaScript引擎会在可访问作用域中查找同名没变量。对象方法的简写语法
在ES5及以前,如果为对象添加方法,必须通过指定名称并完整定义函数来实现;而在ES6中,消除冒号与function关键字。1
2
3
4
5
6var person = {
name: ‘aaa’,
sayName() {
console.log(this.name);
}
}
二者唯一的区别是:简写方法可以使用super关键字。
可计算属性名
在ES5中,如果要通过计算得到属性名,就需要使用方括号代替点记法。有些包括某些字符的字符串字面量作为标识符会出错,其和变量放在方括号中都是被允许的。此外,在对象字面量中,可以直接使用字符串字面量作为属性名称,但是要加上双引号。
在ES6中可在对象字面量中使用可计算属性名称,其语法与引用对象实例的可计算属性名称相同,也是使用方括号。表示该属性名称时可计算的,它的内容将被求值并被转化为一个字符串。1
2
3
4
5var suffix = "name";
var person = {
['first'+suffix]: 'aaa'
};
console.log(person["first name"]); //'aaa'
4.3 新增方法
ECMAScript其中一个设计目标是:不再创建新的全局函数,也不在Object。prototype上创建新的方法。当开发者想向标准添加新方法时,他们会找一个适当的现有对象,让这些方法可用。结果,当没有其他合适对象时,全局Object对象会收到越来越多的对象方法。ES6中,在全局Object对象上引入了一些新方法。
Object.is()方法
在js中比较两个值时,一般使用==或===,但是+0和-0在js引擎中为两个完全不同的实体,而全等操作符会判定两者相等,NaN===NaN返回的也是false。
Object.is()方法来弥补全等操作符的不准确运算。该方法接受两个参数,如果这两个参数类型相同且具有相同的值,则返回true。
Object.assign()方法
该方法接受一个接收对象和任意数量的源对象,并按指定顺序将属性复制(执行的为浅复制)到接收对象中,最终返回接收对象。如果源对象中有同名属性,则排位靠后的源对象会覆盖排位靠前的。
Object.assign()会将源对象的访问器属性变为数据属性。
4.4 重复的对象字面量属性
ES5严格模式下会对重复属性报错,而ES6中不再对重复属性报错,但是取值只选取最后一个取值。
4.5 自有属性枚举顺序
ES6严格规定了对象的自有属性被枚举时的返回顺序,这会影响到Object.getOwnPropertyNames()方法以及Reflect.ownKeys()返回属性的方式,如下:
- 所有数字键按升序排序。
- 所有字符串键按照它们被加入对象的顺序排序。
- 所有symbol键按照它们被加入对象的顺序排序。
4.6增强对象原型
改变对象的原型
正常情况下,无论是通过构造函数还是Object.create()方法创建对象,其原型是对象被创建时指定的。对象原型在实例化后保持不变。
所以在ES6中添加Object.setPropertyOf()方法来改变任意指定对象的原型,它接受两个参数:被改变原型的对象及替代第一个参数原型的对象。简化原型的super引用
super引用相当于指向原型对象的指针,实际上也就是Object.getPropertyOf(this)的值。同样,可以通过super引用调用对象原型上所有其他的方法。当然,必须在使用简写方法的对象中使用super引用。如果在其他方法声明中使用会导致语法错误。4.7 正确的方法定义
在ES6以前从未正式定义“方法”的概念,方法仅仅是一个具有功能而非数据的对象属性。在ES6中正式将方法定义为一个函数。她会有一个内部的[[HomeObject]]属性来容纳这个方法从属的对象。
Super的所有引用都通过[[HomeObject]]属性来确定后续的运行过程。第一步是在[[HomeObject]]属性上调用Object.getPrototypeOf()方法来检索原型的引用;然后搜索原型找到同名函数;最后设置this绑定并且调用相应的方法。