第四章 扩展对象的功能
《深入理解ES6》—— Nicholas C. Zakas
1. 对象类型
- 普通对象
- 奇异对象
- 标准对象
- 内置对象
2. 对象字面量的扩展
2.1. 属性简写
当对象的属性名称与变量名相同时,可以简单书写名称,而省略冒号和值。
function createPerson( name,age ) {
return {
name: name,
age: age
}
// 简写
return {
name,
age
};
}
2.2. 方法简写
改进了为对象字面量方法赋值的语法。省略了 冒号和关键字。
var person = {
// 之前
sleep: function() {},
// 简写
sayName() {}
}
2.3. 需计算属性名
对象字面量的属性名可以由表达式计算而来,这在ES5之前是不允许的。
var prefix = "我的是";
var person = {
[prefix + "姓名"]: "吴钦飞",
[prefix + "性别"]: "男"
}
3. 新的方法
3.1. Object.is() 方法
许多情况下, Object.is()
的结果与严格相等运算符一致,
且弥补了 严格相等运算符 残留的怪异点:
+0 === -0; //=> true
Object.is( +0 === -0 ); //=> false
NaN === NaN; //=> false
Object.is( NaN, NaN ); //=> true
3.2. Object.assign() 方法
类似于 jQuery.extend( receiver, 供应者1, 供应者2, ...... )
浅拷贝
4. 重复的对象字面量属性
ES6移除了重复属性的检查。
"use strict";
var person = {
name: "张三",
// 在ES5严格模式下会出错,但在ES6下没问题,会覆盖前面的同名属性
name: "吴钦飞"
};
5. 自有属性的枚举顺序
自有属性枚举时基本顺序如下:
- 1.数字类型键,按升序排列
- 2.字符串类型键,按添加顺序排列
- 3.符号类型键,按添加顺序排列
示例:
var obj = {
a: 1,
0: 1,
c: 1,
2: 1,
b: 1,
1: 1
}
Object.getOwnPropertyNames( obj ).join( " " );
//=> "0 1 2 a c b"
6. 更强大的原型
6.1. 修改对象的原型
ES6添加 Object.setPrototypeOf()
方法修改对象的原型。
对象的原型的实际值存储在一个内部属性[[Prototype]]
上,
Object.getPrototypeOf()
方法可以返回该值,
Object.setPrototypeOf()
方法可以设置该值。
6.2. super 引用
super
是指向当前对象的原型的一个指针,
实际上就是 Object.getPrototypeOf( this )
的值。
7. 正式的“方法”定义
在ES6之前,“方法”的概念从未被正式定义,它此前仅指对象的函数属性(而非数据属性)。
ES6则正式做出了定义:方法是一个拥有[[HomeObject]]
内部属性的函数,
此内部属性指向该方法所属的对象。
let person = {
// 方法
say() { }
}
// 并非方法
function say() {}