mirror of
https://github.com/ruanyf/es6tutorial.git
synced 2024-04-21 12:32:22 +00:00
fix(class): 继承Object的子类行为
This commit is contained in:
+15
-1
@@ -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关键字,对某个属性设置存值函数和取值函数,拦截该属性的存取行为。
|
||||
|
||||
+12
-2
@@ -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结构有以下三个方法。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user