ES10 中的 Symbol.species:如何选择自定义 Object.prototype 的方法?

在 ES6 中,JavaScript 引入了 Symbol 类型,它是一种唯一且不可变的数据类型。在 ES10 中,它又新增了一个 Symbol.species 属性,用于自定义构造函数的创建方法。本文将介绍 Symbol.species 的概念、使用场景以及如何选择自定义 Object.prototype 的方法。

Symbol.species 的概念

Symbol.species 属性是一个内置 Symbol 值,它是一个函数,用于创建派生对象的构造函数。它是在派生类中使用的,当派生类需要创建一个新的实例时,它会使用 Symbol.species 属性指定的构造函数来创建实例。

使用场景

Symbol.species 属性通常用于派生类中,例如在 Array 类中,当使用 map、filter、slice 等方法时,它们返回的是一个新的数组实例,而不是原始数组的实例。这是因为这些方法都使用了 Symbol.species 属性来创建新的数组实例。

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

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

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

上面的代码中,我们定义了一个 MyArray 类,它继承自 Array 类,并通过 Symbol.species 属性指定了构造函数为 Array。当我们使用 filter 方法时,它返回的是一个新的 Array 实例而不是 MyArray 实例。

自定义 Object.prototype 的方法

在使用 Symbol.species 属性时,我们需要考虑如何选择自定义 Object.prototype 的方法。通常有两种方法:

方法一:使用 Object.create()

我们可以使用 Object.create() 方法来创建一个新的对象,它的原型链指向指定的原型对象。我们可以将 Symbol.species 属性设为一个返回新对象的函数,这个函数通过 Object.create() 方法创建一个原型为参数的新对象。

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

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

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

上面的代码中,我们定义了一个 MyObject 类,它继承自 Object 类,并通过 Symbol.species 属性指定了构造函数为一个返回 Object.create() 方法创建的新对象的函数。当我们使用 Object.assign() 方法时,它返回的是一个新的 Object 实例而不是 MyObject 实例。

方法二:直接返回构造函数

我们也可以直接将 Symbol.species 属性设为一个构造函数,这个构造函数可以接收一个参数,返回一个新的实例。

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

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

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

上面的代码中,我们定义了一个 MyObject 类,它继承自 Object 类,并通过 Symbol.species 属性指定了构造函数为 Object。当我们使用 Object.assign() 方法时,它返回的是一个新的 Object 实例而不是 MyObject 实例。

总结

Symbol.species 属性是一个用于自定义构造函数的创建方法的内置 Symbol 值。它通常用于派生类中,当派生类需要创建一个新的实例时,它会使用 Symbol.species 属性指定的构造函数来创建实例。在使用 Symbol.species 属性时,我们需要考虑如何选择自定义 Object.prototype 的方法,通常有两种方法:使用 Object.create() 方法和直接返回构造函数。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6613b269d10417a22242de56