1
0
mirror of https://github.com/ruanyf/es6tutorial.git synced 2025-05-28 21:32:20 +00:00

fix error

This commit is contained in:
ruanyf 2015-10-15 22:09:37 +08:00
parent 86eca41818
commit 349e0fd048
7 changed files with 36 additions and 30 deletions

View File

@ -782,7 +782,7 @@ xhr.open('GET', someUrl);
xhr.responseType = 'arraybuffer';
xhr.onload = function () {
var let arrayBuffer = xhr.response;
let arrayBuffer = xhr.response;
// ···
};

View File

@ -455,7 +455,7 @@ obj.foo() // "foo"
## Trait
Trait也是一种修饰器功能与Mixin类型,但是提供更多功能,比如防止同名方法的冲突、排除混入某些方法、为混入的方法起别名等等。
Trait也是一种修饰器效果与Mixin类似,但是提供更多功能,比如防止同名方法的冲突、排除混入某些方法、为混入的方法起别名等等。
下面采用[traits-decorator](https://github.com/CocktailJS/traits-decorator)这个第三方模块作为例子。这个模块提供的traits修饰器不仅可以接受对象还可以接受ES6类作为参数。
@ -478,7 +478,7 @@ obj.foo() // foo
obj.bar() // bar
```
上面代码中通过traits修饰器在MyClass类上面“混入”了TFoo类的foo方法和TBar对象的bar方法。
上面代码中通过traits修饰器`MyClass`类上面“混入”了`TFoo`类的`foo`方法和`TBar`对象的`bar`方法。
Trait不允许“混入”同名方法。

View File

@ -471,13 +471,19 @@ bar.name // "baz"
bar.name // "baz"
```
只有具名函数才有`name`这个属性,匿名函数是没有的
`Function`构造函数返回的函数实例,`name`属性的值为“anonymous”
```javascript
'name' in (function () {})
// false
'name' in (() => {})
// false
(new Function).name // "anonymous"
```
`bind`返回的函数,`name`属性值会加上“bound ”前缀。
```javascript
function foo() {};
foo.bind({}).name // "bound foo"
(function(){}).bind({}).name // "bound "
```
## 箭头函数

View File

@ -558,7 +558,7 @@ function log(generator) {
var v;
console.log('starting generator');
try {
g.next(); // { value: undefined, done: true } v = generator.next();
v = generator.next(); // { value: undefined, done: true }
console.log('第一次运行next方法', v);
} catch (err) {
console.log('捕捉错误', v);
@ -587,7 +587,7 @@ log(g());
// caller done
```
上面代码一共三次运行next方法第二次运行的时候会抛出错误然后第三次运行的时候Generator函数就已经结束了不再执行下去了。
上面代码一共三次运行`next`方法第二次运行的时候会抛出错误然后第三次运行的时候Generator函数就已经结束了不再执行下去了。
## Generator.prototype.return()

View File

@ -23,6 +23,12 @@ Iterator的遍历过程是这样的。
下面是一个模拟next方法返回值的例子。
```javascript
var it = makeIterator(['a', 'b']);
it.next() // { value: "a", done: false }
it.next() // { value: "b", done: false }
it.next() // { value: undefined, done: true }
function makeIterator(array){
var nextIndex = 0;
return {
@ -33,12 +39,6 @@ function makeIterator(array){
}
}
}
var it = makeIterator(['a', 'b']);
it.next() // { value: "a", done: false }
it.next() // { value: "b", done: false }
it.next() // { value: undefined, done: true }
```
上面代码定义了一个makeIterator函数它是一个遍历器生成函数作用就是返回一个遍历器对象。对数组`['a', 'b']`执行这个函数就会返回该数组的遍历器对象即指针对象it。
@ -52,6 +52,13 @@ next方法返回一个对象表示当前数据成员的信息。这个对象
由于Iterator只是把接口规格加到数据结构之上所以遍历器与它所遍历的那个数据结构实际上是分开的完全可以写出没有对应数据结构的遍历器对象或者说用遍历器对象模拟出数据结构。下面是一个无限运行的遍历器对象的例子。
```javascript
var it = idMaker();
it.next().value // '0'
it.next().value // '1'
it.next().value // '2'
// ...
function idMaker(){
var index = 0;
@ -61,13 +68,6 @@ function idMaker(){
}
}
}
var it = idMaker();
it.next().value // '0'
it.next().value // '1'
it.next().value // '2'
// ...
```
上面的例子中遍历器生成函数idMaker返回一个遍历器对象即指针对象。但是并没有对应的数据结构或者说遍历器对象自己描述了一个数据结构出来。
@ -488,7 +488,7 @@ for (a of arr) {
Set和Map结构也原生具有Iterator接口可以直接使用`for...of`循环。
```javascript
var engines = Set(["Gecko", "Trident", "Webkit", "Webkit"]);
var engines = new Set(["Gecko", "Trident", "Webkit", "Webkit"]);
for (var e of engines) {
console.log(e);
}

View File

@ -481,7 +481,7 @@ var obj = Object.create(someOtherObj);
obj.method = function() { ... }
```
该属性没有写入ES6的正文而是写入了附录原因是`__proto__`前后的双引号说明它本质上是一个内部属性而不是一个正式的对外的API只是由于浏览器广泛支持才被加入了ES6。标准明确规定只有浏览器必须部署这个属性其他运行环境不一定需要部署而且新的代码最好认为这个属性是不存在的。因此无论从语义的角度还是从兼容性的角度都不要使用这个属性而是使用下面的`Object.setPrototypeOf()`(写操作)、`Object.getPrototypeOf()`(读操作)、`Object.create()`(生成操作)代替。
该属性没有写入ES6的正文而是写入了附录原因是`__proto__`前后的双下划线说明它本质上是一个内部属性而不是一个正式的对外的API只是由于浏览器广泛支持才被加入了ES6。标准明确规定只有浏览器必须部署这个属性其他运行环境不一定需要部署而且新的代码最好认为这个属性是不存在的。因此无论从语义的角度还是从兼容性的角度都不要使用这个属性而是使用下面的`Object.setPrototypeOf()`(写操作)、`Object.getPrototypeOf()`(读操作)、`Object.create()`(生成操作)代替。
在实现上,`__proto__`调用的是`Object.prototype.__proto__`,具体实现如下。

View File

@ -340,10 +340,10 @@ var twice = {
apply (target, ctx, args) {
return Reflect.apply(...arguments) * 2;
}
}
};
function sum (left, right) {
return left + right;
}
};
var proxy = new Proxy(sum, twice);
proxy(1, 2) // 6
proxy.call(null, 5, 6) // 22
@ -370,10 +370,10 @@ var handler = {
}
return key in target;
}
}
};
var target = { _prop: 'foo', prop: 'foo' };
'_prop' in proxy
// false
var proxy = new Proxy(target, handler);
'_prop' in proxy // false
```
上面代码中,如果原对象的属性名的第一个字符是下划线,`proxy.has`就会返回`false`,从而不会被`in`运算符发现。