Symbol.species
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 |
浏览器兼容性
加载中…