ECMAScript 2017 中的 Symbol.species 属性详解及其在类继承中的应用

阅读时长 3 分钟读完

简介

Symbol.species 是ECMAScript 2017标准中新增的一个属性。该属性是一个ES6原始数据类型,它允许开发者自定义派生对象的构造器函数。

Symbol.species属性主要用于帮助类继承时控制返回的实例类型,以及避免跨域的调用从而达到更好的性能。

语法

Symbol.species 符号可以由全局符号注册表创建

作用

Symbol.species 主要用于类继承时,确认子类对象生成返回的对象类型。

当在父类中使用某个方法处理某个对象时,这个对象被转化为一个新的对象,所产生的实例类型就是由 Symbol.Species 指向的构造函数决定的。这样有重写方便父类静态方法时,不会影响子类的实例类型。

参照下面的示例代码,就可以直观地看出在数组和 map 迭代方法中调用 symbol.species 属性对结果的影响。

示例: 数组迭代

-- -------------------- ---- -------
----- ------- ------- ----- -
    ------ --- ------------------ - ------ ------ -
-

----- ------- - --- ---------- -- -- -- ---

-- -- ------ --
----- ----- - ---------------- -- - - - --- ---
----------------- ---------- --------- -- -----
----------------- ---------- ------- -- ----
展开代码

上述代码定义的 MyArrayArray 的子类。由于我们在定义时使用了 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

纠错
反馈

纠错反馈