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 )开始生成器函数的定义。

results matching ""

    No results matching ""