@@ -569,21 +569,25 @@ a2[1] = 6;
569
569
class MyArray extends Array {
570
570
}
571
571
572
- const a = new MyArray ();
573
- a .map (x => x) instanceof MyArray // true
572
+ const a = new MyArray (1 , 2 , 3 );
573
+ const b = a .map (x => x);
574
+ const c = a .filter (x => x > 1 );
575
+
576
+ b instanceof MyArray // true
577
+ c instanceof MyArray // true
574
578
```
575
579
576
- 上面代码中,子类` MyArray ` 继承了父类` Array ` 。 ` a.map(x => x) ` 会创建一个 ` MyArray ` 的衍生对象,该衍生对象还是 ` MyArray ` 的实例。
580
+ 上面代码中,子类` MyArray ` 继承了父类` Array ` , ` a ` 是 ` MyArray ` 的实例, ` b ` 和 ` c ` 是 ` a ` 的衍生对象。你可能会认为, ` b ` 和 ` c ` 都是调用数组方法生成的,所以应该是数组( ` Array ` 的实例),但实际上它们也是 ` MyArray ` 的实例。
577
581
578
- 现在,` MyArray ` 设置` Symbol.species ` 属性。
582
+ ` Symbol.species ` 属性就是为了解决这个问题而提供的。 现在,我们可以为 ` MyArray ` 设置` Symbol.species ` 属性。
579
583
580
584
``` javascript
581
585
class MyArray extends Array {
582
586
static get [Symbol .species ]() { return Array ; }
583
587
}
584
588
```
585
589
586
- 上面代码中,由于定义了` Symbol.species ` 属性,创建衍生对象时就会使用这个属性返回的函数,作为构造函数。这个例子也说明,定义` Symbol.species ` 属性要采用` get ` 读取器 。默认的` Symbol.species ` 属性等同于下面的写法。
590
+ 上面代码中,由于定义了` Symbol.species ` 属性,创建衍生对象时就会使用这个属性返回的函数,作为构造函数。这个例子也说明,定义` Symbol.species ` 属性要采用` get ` 取值器 。默认的` Symbol.species ` 属性等同于下面的写法。
587
591
588
592
``` javascript
589
593
static get [Symbol .species ]() {
@@ -599,11 +603,13 @@ class MyArray extends Array {
599
603
}
600
604
601
605
const a = new MyArray ();
602
- a .map (x => x) instanceof MyArray // false
603
- a .map (x => x) instanceof Array // true
606
+ const b = a .map (x => x);
607
+
608
+ b instanceof MyArray // false
609
+ b instanceof Array // true
604
610
```
605
611
606
- 上面代码中,` a.map(x => x) ` 创建的衍生对象 ,就不是` MyArray ` 的实例,而直接就是` Array ` 的实例。
612
+ 上面代码中,` a.map(x => x) ` 生成的衍生对象 ,就不是` MyArray ` 的实例,而直接就是` Array ` 的实例。
607
613
608
614
再看一个例子。
609
615
0 commit comments