Symbol.species

Baseline 已广泛支持

此特性已非常成熟,可在多种设备和浏览器版本上使用。自 ⁨2016 年 9 月⁩以来,它已在各大浏览器中可用。

Symbol.species 静态数据属性代表 知名 Symbol Symbol.species。创建对象副本的方法可能会在对象上查找此 Symbol,以便在创建副本时使用构造函数。

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

试一试

class Array1 extends Array {
  static get [Symbol.species]() {
    return Array;
  }
}

const a = new Array1(1, 2, 3);
const mapped = a.map((x) => x * x);

console.log(mapped instanceof Array1);
// Expected output: false

console.log(mapped instanceof Array);
// Expected output: true

知名 Symbol Symbol.species

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

描述

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

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

示例

使用 species

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

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® 2026 语言规范
# sec-symbol.species

浏览器兼容性

另见