有没有办法在node.js中的对象文字中指定ES6生成器方法?

时间:2015-04-20 14:18:07

标签: javascript node.js iterator ecmascript-6

我似乎无法将生成器方法创建为对象文字。

这是我的工作源代码:

function *getRecords (data) {
    for (var i = 0; i < data.length; i++) {
        yield data[i];
    }
}
var records = getRecords(data);
for (var record of records) {
   // process my record
}

但是当我在对象文字中移动我的生成器方法时:

var myobj = {
    *getRecords: function (data) {...}
}

我得到SyntaxError: Unexpected token *

如果我添加引号

var myobj = {
    '*getRecords': function (data) {...}
}

我得到:SyntaxError: Unexpected strict mode reserved word

我使用--harmony选项运行nodejs v0.12.2,但无论我做什么,我似乎无法让它工作。

3 个答案:

答案 0 :(得分:9)

@thefoureye已经回答,如果您使用的是函数表达式,那么您必须在*令牌之后放置function令牌。

但是,您也可以在对象文字中使用方法定义。在这里,您确实将*放在生成器方法名称之前,但是与每个方法定义一样,它不包含冒号和function关键字:

var myobj = {
    *getRecords(data) {
        …
    }
};

答案 1 :(得分:8)

*应位于function关键字之后,如此

var myobj = {
    getRecords: function* (data) {}
}

for (var record of myobj['getRecords']()) {}

引用Draft version of ECMA Script - 6's definition for Generator Expression

  

function *(FormalParameters [Yield,Gen​​eratorParameter] ){

     

GeneratorBody

     

}

注意:生成器表达式与生成器功能不同。将其分配给变量或将其与Object literal中的键关联时,实际上是在分配Generator表达式。正常的生成器声明将是这样的

function * GeneratorFunctionName(...) {
}

答案 2 :(得分:4)

以下是如何在普通对象定义中执行此操作:

var myobj = {
    getRecords: function* (data) {...}
}

这里如何在ES6类定义中执行:

class MyClass {
    * getRecords(data) {...}
}
var myobj = new MyClass();