ES6 对象的扩展
目录 第四章 扩展对象的功能性对象类别对象字面量语法扩展属性初始值的改写对象方法的简写可计算属性名新增方法Object.is()方法Object.assign()方法重复的对象字面量属性自有属性枚举顺序增强对象原型改变对象原型简化原型访问的super引用正式的方法定义
第四章 扩展对象的功能性
对象类别
- 普通(Ordinary)对象:具有JS对象所有默认内部行为。
- 特异(Exotic)对象:具有某些与默认行为不符的内部行为。
- 标准(Standard)对象:ES6规范中定义的对象,如Array、Date等。
- 内建(Built-in)对象:脚本开始执行时,存在于JS执行环境中的对象。
对象字面量语法扩展
属性初始值的改写
当一个对象的属性与本地变量同名时,不必再写冒号和值,只需要写属性名。
function createPerson (name, age) {
return {name, age};
}
对象方法的简写
对象中声明方法,不需要冒号和function关键字。
var person = {
sayName () {
console.log('name');
},
};
可计算属性名
对象属性可以用变量表示。
var prefix = 'my';
var person = {
[prefix + 'number']: '123', // 等同于 mynumber:'123'
};
新增方法
Object.is()方法
修正全等运算符中的两处疑惑点:
- +0 === -0
- NaN !== NaN
Object.assign()方法
实现了类似于mixin的方法。
function mixin (source, supplier) {
Object.keys(supplier).forEach(function (key) {
source[key] = supplier[key];
});
return source;
}
Object.assign()的好处在于,可以复制访问器属性(get和set)。
重复的对象字面量属性
代码不检查重复属性,对于每一组重复属性,都会选取最后一个取值。
自有属性枚举顺序
基本规则是:
- 所有数字键按升序排序
- 所有字符串键按照它们被加入的对象的顺序排序
- 所有Symbol键按照它们被加入对象的顺序排序
增强对象原型
改变对象原型
添加与Object.getPrototypeOf()相对的Object.setPrototypeOf()方法,用于设置目标对象的__proto__(或理解为[[Prototype]])。
简化原型访问的super引用
super引用相当于指向对象原型的指针,实际上也就是Object.getPrototypeOf(this)的返回值。
super.fn()等效于Object.getPrototypeOf(this).fn.call(this)。
super是静态的,总是指向正确的对象,所以不需要担心运行时的特性。
正式的方法定义
super的所有引用都通过[[HomeObject]]属性来确定后续的运行过程。第一步是在[[HomeObject]]属性上调用Object.getPrototypeOf()方法来检索原型的引用;然后搜寻原型链,找到同名函数;最后,设置this绑定并且调用相应的方法。