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
+1 -1
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;
// ···
};
+2 -2
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不允许“混入”同名方法。
+11 -5
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 "
```
## 箭头函数
+2 -2
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()
+14 -14
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);
}
+1 -1
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__`,具体实现如下。
+5 -5
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`运算符发现。