fix(class): 继承Object的子类行为

This commit is contained in:
ruanyf
2016-03-26 21:00:11 +08:00
parent 96c3de7eaa
commit 8796fc605f
2 changed files with 27 additions and 3 deletions
+15 -1
View File
@@ -427,7 +427,7 @@ cp instanceof ColorPoint // true
cp instanceof Point // true
```
上面代码中,实例对象cp同时是ColorPointPoint两个类的实例,这与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关键字,对某个属性设置存值函数和取值函数,拦截该属性的存取行为。
+12 -2
View File
@@ -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结构有以下三个方法。