简介
Symbol.species 是ECMAScript 2017标准中新增的一个属性。该属性是一个ES6原始数据类型,它允许开发者自定义派生对象的构造器函数。
Symbol.species属性主要用于帮助类继承时控制返回的实例类型,以及避免跨域的调用从而达到更好的性能。
语法
Symbol.species 符号可以由全局符号注册表创建
Symbol.species
作用
Symbol.species 主要用于类继承时,确认子类对象生成返回的对象类型。
当在父类中使用某个方法处理某个对象时,这个对象被转化为一个新的对象,所产生的实例类型就是由 Symbol.Species 指向的构造函数决定的。这样有重写方便父类静态方法时,不会影响子类的实例类型。
参照下面的示例代码,就可以直观地看出在数组和 map 迭代方法中调用 symbol.species 属性对结果的影响。
示例: 数组迭代
-- -------------------- ---- ------- ----- ------- ------- ----- - ------ --- ------------------ - ------ ------ - - ----- ------- - --- ---------- -- -- -- --- -- -- ------ -- ----- ----- - ---------------- -- - - - --- --- ----------------- ---------- --------- -- ----- ----------------- ---------- ------- -- ----展开代码
上述代码定义的 MyArray
是 Array
的子类。由于我们在定义时使用了 Symbol.species
属性,因此调用该类对象的 filter 方法产生的数组类型是 Array 而不是 MyArray。
示例: Map迭代
-- -------------------- ---- ------- ----- ----- ------- --- - ------ --- ------------------ - ------ ---- - - ----- ----- - --- -------- -------------- ----------- --- -- -- --- -- ----- ------------ - ---------------- ------- -- ------------------- ------------------------ ---------- ------- -- ----- ------------------------ ---------- ----- -- ----展开代码
上述示例代码和前一个示例中的 MyArray
一样是一个继承自它父类 Map
的子类 MyMap
。同样在定义这个子类时我们也指定了其 Species
属性为 Map
构造函数。
小结:
通过两个示例我们可以看出,如果没有使用 Symbol.species
, 在类继承时经常会发生错误,需要手动更改实例类型, 虽然修改实例类型不难,但根据上面的示例可能需要应对多种情况的代码。使用 Symbol.species 可以避免手动修改实例类型的繁琐操作。
总结
- Symbol.species 允许开发者自定义派生对象的构造函数。
- 当在父类中使用某个方法处理某个对象时,这个对象被转化为一个新的对象,所产生的实例类型就是由 Symbol.Species 指向的构造函数决定的。
- 在继承体系中使用 Symbol.species 可以帮助开发者更精准地控制待返回的对象类型,并避免跨域调用。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6517297e95b1f8cacdf67295