Symbol.species 是用于控制派生类方法返回新实例时所用构造函数的内置符号;它不影响显式构造,仅作用于 map、filter、then 等内置方法的返回值,需通过 static get [Symbol.species]() 定义。

Symbol.species 是一个内置的符号值,用于控制派生类(如继承自 Array、Promise 等内置类的子类)在执行某些内置方法时,**应该用哪个构造函数来创建新实例**。它不修改类本身的构造行为,而是影响“由该类方法返回的新对象”的类型。
为什么需要 Symbol.species?
比如你写了一个 MyArray extends Array,调用 myArr.map(...) 时,默认会返回 MyArray 实例(符合直觉)。但有些场景你希望它返回原生 Array(比如避免子类额外开销),或指定另一个构造器(如 ImmutableArray)。这时就靠 Symbol.species 控制。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
怎么设置 Symbol.species?
在类中定义静态的 [Symbol.species] getter,返回你想要的构造函数:
class MyArray extends Array {
static get [Symbol.species]() {
return Array; // map/filter/slice 等方法将返回原生 Array
}
}
<p>const arr = new MyArray(1, 2, 3);
const mapped = arr.map(x => x * 2);</p><p>console.log(mapped instanceof MyArray); // false
console.log(mapped instanceof Array); // true
哪些方法会用到 Symbol.species?
以下内置方法会在内部调用 this.constructor[Symbol.species] 来创建返回值(前提是该 constructor 有这个属性):
-
Array.prototype.map、filter、slice、concat、flat等 -
Promise.prototype.then、catch、finally -
RegExp.prototype.exec(某些引擎)、String.prototype.matchAll(返回的迭代器相关) -
TypedArray的类似方法(如map)
注意事项和常见陷阱
-
Symbol.species只影响“由方法返回的新实例”,不影响new MyArray()或MyArray.from()等显式构造 - 如果 getter 返回
null或undefined,JavaScript 会回退到使用原构造函数(即this.constructor) - 不能用普通属性赋值方式设置:
MyArray[Symbol.species] = Array无效,必须是static get [Symbol.species]() - 对于 Promise 子类,
then()返回的仍是 Promise 实例,但构造器由[Symbol.species]决定 —— 这意味着你可以让then返回不同子类

















