第四章、扩展对象的功能性
1、对象字面量语法扩展
当一个对象的属性与本地变量同名时,不必再写冒号和值,简单的只写属性名即可。
2、可计算属性名
任何可用于对象实例括号记法[]的属性名,也可以作为字面量中的计算属性名。
3、新增方法
1、Object.is():比较两个值是否相等,它是弥补===的不准确运算。
两个特例:
console.log(Object.is(+0,-0)) //false
console.log(Object.is(NaN,NaN)) //true
console.log(+0 === -0) //true
console.log(NaN === NaN) //false
2、Object.assign():对象复制(深复制),接受任意数量的源对象,并按指定的顺序将属性复制到接收对象中。
如果多个源对象具有同名属性,则排位靠后的源对象会覆盖排位靠前的。
注意:Object.assign()方法不能将提供者的访问器属性(get/set)复制到接收器对象中,而是将其转为接收对象的一个数据属性。
各种第三方库都有实现同类方法,例如jQuery的extend()方法
3、重复的对象字面量属性:
es6中重复检查属性被移除,所以取最后一次赋值。例如:
let person = {
name: 'zhangsan',
name: 'lisi'
}
console.log(person.name); //lisi
4、自有属性枚举顺序
基本原则:
1、所有数字键按升序排序
2、所有字符串键按照他们被加入对象的顺序排序
3、所有symbol键按照他们被加入对象的顺序排序
被影响到的方法:
Object.getOwnPropertyNames()
Object.assign()
Reflect.ownKeys
4、增强对象原型
1、改变对象的原型
创建对象:构造函数、Object.create()
正常情况,通过以上两种方法创建的对象,其原型实在对象被创建时指定的。
Object.getPrototypeOf():返回任意指定对象的原型
Object.setPrototypeOf():改变任意指定对象的原型
对象原型的真实值被存储在内部专用属性[[Prototype]]中
2、简化原型访问的Super引用
Super引用相当于指向对象原型的指针,实际上就是Object.getPrototypeOf(this)的值
Super引用在多重继承的情况下非常有用,使用Object.getPrototypeOf()会有问题
Super引用不是动态变化的,它总是执行最初指定的那个原型
3、正式的方法定义
es6中正式将方法定义为一个函数,它会有一个内部的[[HomeObject]]属性来容纳这个方法从属的对象。例如:
let person = {
getGretting(){
return "hello";
}
}
这个概念对使用Super引用非常有用。
Super的所有引用都通过[[HomeObject]]属性来确定后续的运行过程。
①、在[[HomeObject]]属性上调用Object.getPrototypeOf()来检索原型的引用。
②、搜索原型找到同名函数。
③、设置this绑定并且调用相应的方法。