Symbol.species

Symbol.species 静态数据属性表示 众所周知的符号 Symbol.species。创建对象副本的方法可能会在该对象上查找此符号,以获取在创建副本时使用的构造函数。

警告: [Symbol.species] 的存在允许执行任意代码,并可能导致安全漏洞。它也使某些优化变得更加困难。引擎实现者正在 调查是否要删除此功能。如果可能,请避免依赖它。

试一试

众所周知的符号 Symbol.species

Symbol.species 的属性属性
可写
可枚举
可配置

描述

[Symbol.species] 访问器属性允许子类覆盖对象的默认构造函数。这指定了有关如何复制实例的协议。例如,当您使用数组的复制方法(例如 map())时,map() 方法使用 instance.constructor[Symbol.species] 获取用于构造新数组的构造函数。有关更多信息,请参阅 子类化内置类.

所有内置的 [Symbol.species] 实现都会返回 this 值,即当前实例的构造函数。这允许复制方法创建派生类而不是基类的实例——例如,map() 将返回与原始数组类型相同的数组。

示例

使用 species

您可能希望在派生数组类 MyArray 中返回 Array 对象。例如,当使用返回默认构造函数的方法(例如 map())时,您希望这些方法返回父 Array 对象,而不是 MyArray 对象。species 符号可以让您做到这一点

js
class MyArray extends Array {
  // Overwrite species to the parent Array constructor
  static get [Symbol.species]() {
    return Array;
  }
}
const a = new MyArray(1, 2, 3);
const mapped = a.map((x) => x * x);

console.log(mapped instanceof MyArray); // false
console.log(mapped instanceof Array); // true

规范

规范
ECMAScript 语言规范
# sec-symbol.species

浏览器兼容性

BCD 表格仅在浏览器中加载

另请参阅