1
0
mirror of https://github.com/ruanyf/es6tutorial.git synced 2025-05-25 19:22:21 +00:00

edit generator/constructor

This commit is contained in:
Ruan Yifeng 2015-07-29 16:26:22 +08:00
parent 6eef1c75f3
commit f790a5ea17

View File

@ -713,6 +713,44 @@ let obj = {
};
```
## 构造函数是Generator函数
这一节讨论一种特殊情况构造函数是Generator函数。
```javascript
function* F(){
yield this.x = 2;
yield this.y = 3;
}
```
上面代码中函数F是一个构造函数又是一个Generator函数。这时使用new命令就无法生成F的实例了因为F返回的是一个内部指针。
```javascript
'next' in (new F())
// true
```
上面代码中,由于`new F()`返回的是一个Iterator对象具有next方法所以上面的表达式为true。
那么,这个时候怎么生成对象实例呢?
我们知道如果构造函数调用时没有使用new命令那么内部的this对象绑定当前构造函数所在的对象比如window对象。因此可以生成一个空对象使用bind方法绑定F内部的this。这样构造函数调用以后这个空对象就是F的实例对象了。
```javascript
var obj = {};
var f = F.bind(obj)();
f.next();
f.next();
f.next();
console.log(obj);
// { x: 2, y: 3 }
```
上面代码中首先是F内部的this对象绑定obj对象然后调用它返回一个Iterator对象。这个对象执行三次next方法因为F内部有两个yield语句完成F内部所有代码的运行。这时所有内部属性都绑定在obj对象上了因此obj对象也就成了F的实例。
## Generator函数推导
ES7在数组推导的基础上提出了Generator函数推导Generator comprehension