14.2 对象字面量的新特性
14.2.1 方法定义
在 ECMAScript 5 中,方法是值为函数的属性:
var obj = {
myMethod: function (x, y) {
···
}
};
在 ECMAScript 6 中,方法仍然是函数值属性,但是现在多了一种定义方法的方式:
let obj = {
myMethod(x, y) {
···
}
};
getters 和 setters 仍然和 ECMAScript 5 中一样有效(注意在语法上和方法定义是如何相似的):
let obj = {
get foo() {
console.log('GET foo');
return 123;
},
set bar(value) {
console.log('SET bar to '+value);
// return value is ignored
}
};
使用 obj
:
> obj.foo
GET foo
123
> obj.bar = true
SET bar to true
true
也有一种简明的方式定义值为生成器函数的属性:
let obj = {
* myGeneratorMethod() {
···
}
};
上述代码等价于:
let obj = {
myGeneratorMethod: function* () {
···
}
};
14.2.2 属性值缩写
属性值简称使你在对象字面量中简写属性的定义:如果用于指定属性值的变量名字也是属性键,则可以省略键。看起来像下面这样:
let x = 4;
let y = 1;
let obj = { x, y };
最后一行等价于:
let obj = { x: x, y: y };
属性值简称也可以用于解构:
let obj = { x: 4, y: 1 };
let {x,y} = obj;
console.log(x); // 4
console.log(y); // 1
属性值简称的使用场景之一就是多值返回(在解构那一章讲解了)。
14.2.3 计算的属性键
记住在设置属性的时候,有两种方法指定一个键。
- 1、通过一个固定的名字:
obj.foo = true
; - 2、通过表达式:
obj['b' + 'ar']
= 123;
在对象字面量中, ECMAScript 5 只能使用第一种方式。 ECMAScript 6 提供了可选的第二种方式:
let propKey = 'foo';
let obj = {
[propKey]: true,
['b'+'ar']: 123
};
新的语法也可以用于方法定义:
let obj = {
['h'+'ello']() {
return 'hi';
}
};
console.log(obj.hello()); // hi
计算属性键的主要使用场景是 Symbol :可以定义一个公开的 symbol ,然后使用它作为特殊的属性键,该键总是唯一的。一个出名的例子就是存储在 Symbol.iterator
中的 Symbol 。如果某个对象有一个方法的键是 Symbol.iterator
,那么这个对象就变成了可迭代的对象:这个方法必须返回一个迭代器,该迭代器用于在 for-of
循环等地方迭代这个对象。下面的代码展示了这是怎么运作的。
let obj = {
* [Symbol.iterator]() { // (A)
yield 'hello';
yield 'world';
}
};
for (let x of obj) {
console.log(x);
}
// Output:
// hello
// world
行 A 以一个计算键(存储在 Symbol.iterator
中的 Symbol )开始生成器函数的定义。