diff --git a/docs/class.md b/docs/class.md index edb7411..53671e6 100644 --- a/docs/class.md +++ b/docs/class.md @@ -427,7 +427,7 @@ cp instanceof ColorPoint // true cp instanceof Point // true ``` -上面代码中,实例对象cp同时是ColorPoint和Point两个类的实例,这与ES5的行为完全一致。 +上面代码中,实例对象`cp`同时是`ColorPoint`和`Point`两个类的实例,这与ES5的行为完全一致。 ### 类的prototype属性和\_\_proto\_\_属性 @@ -741,6 +741,20 @@ myerror.stack // ... ``` +注意,继承`Object`的子类,有一个[行为差异](http://stackoverflow.com/questions/36203614/super-does-not-pass-arguments-when-instantiating-a-class-extended-from-object)。 + +```javascript +class NewObj extends Object{ + constructor(){ + super(...arguments); + } +} +var o = new NewObj({attr: true}); +console.log(o.attr === true); // false +``` + +上面代码中,`NewObj`继承了`Object`,但是无法通过`super`方法向父类`Object`传参。这是因为ES6改变了`Object`构造函数的行为,一旦发现`Object`方法不是通过`new Object()`这种形式调用,ES6规定`Object`构造函数会忽略参数。 + ## Class的取值函数(getter)和存值函数(setter) 与ES5一样,在Class内部可以使用get和set关键字,对某个属性设置存值函数和取值函数,拦截该属性的存取行为。 diff --git a/docs/set-map.md b/docs/set-map.md index 64d43e8..ba9a634 100644 --- a/docs/set-map.md +++ b/docs/set-map.md @@ -288,7 +288,7 @@ ws.add(Symbol()) // TypeError: invalid value used in weak set ``` -上面代码试图向WeakSet添加一个数值和`Symbol`值,结果报错。 +上面代码试图向WeakSet添加一个数值和`Symbol`值,结果报错,因为WeakSet只能放置对象。 WeakSet是一个构造函数,可以使用`new`命令,创建WeakSet数据结构。 @@ -303,7 +303,17 @@ var a = [[1,2], [3,4]]; var ws = new WeakSet(a); ``` -上面代码中,a是一个数组,它有两个成员,也都是数组。将a作为WeakSet构造函数的参数,a的成员会自动成为WeakSet的成员。 +上面代码中,`a`是一个数组,它有两个成员,也都是数组。将`a`作为WeakSet构造函数的参数,`a`的成员会自动成为WeakSet的成员。 + +注意,是`a`数组的成员成为WeakSet的成员,而不是`a`数组本身。这意味着,数组的成员只能是对象。 + +```javascript +var b = [3, 4]; +var ws = new WeakSet(b); +// Uncaught TypeError: Invalid value used in weak set(…) +``` + +上面代码中,数组`b`的成员不是对象,加入WeaKSet就会报错。 WeakSet结构有以下三个方法。