Promise[Symbol.species]
Promise[Symbol.species] 静态访问器属性返回用于从 Promise 方法构建返回值(return value)的构造函数。
警告: [Symbol.species] 的存在允许执行任意代码,并可能产生安全漏洞。它还会使某些优化变得更加困难。引擎实现者正在 调查是否要移除此功能。如果可能,请避免依赖它。
语法
Promise[Symbol.species]
返回值
调用 get [Symbol.species] 时,构造函数 (this) 的值。返回值用于从构建新 Promise 的 Promise 链式方法(promise chaining methods)构建返回值。
描述
[Symbol.species] 访问器属性返回 Promise 对象的默认构造函数。子类构造函数可以重写它以更改构造函数分配。默认实现基本上是
// Hypothetical underlying implementation for illustration
class Promise {
static get [Symbol.species]() {
return this;
}
}
由于这种多态实现,派生子类的 [Symbol.species] 默认情况下也将返回构造函数本身。
class SubPromise extends Promise {}
SubPromise[Symbol.species] === SubPromise; // true
Promise 链式方法 — then()、catch() 和 finally() — 会返回新的 Promise 对象。它们通过 this.constructor[Symbol.species] 获取用于构造新 Promise 的构造函数。如果 this.constructor 是 undefined,或者 this.constructor[Symbol.species] 是 undefined 或 null,则使用默认的 Promise() 构造函数。否则,将使用 this.constructor[Symbol.species] 返回的构造函数来构造新的 Promise 对象。
示例
普通对象中的 species
Symbol.species 属性返回默认构造函数,即 Promise 的 Promise 构造函数。
Promise[Symbol.species]; // [Function: Promise]
派生对象中的 species
在自定义 Promise 子类的实例中,例如 MyPromise,MyPromise 的 species 是 MyPromise 构造函数。但是,您可能希望重写它,以便在派生类的方法中返回父 Promise 对象。
class MyPromise extends Promise {
// Override MyPromise species to the parent Promise constructor
static get [Symbol.species]() {
return Promise;
}
}
默认情况下,Promise 方法将返回子类类型的 Promise。
class MyPromise extends Promise {
someValue = 1;
}
console.log(MyPromise.resolve(1).then(() => {}).someValue); // 1
通过重写 [Symbol.species],Promise 方法将返回基础 Promise 类型。
class MyPromise extends Promise {
someValue = 1;
static get [Symbol.species]() {
return Promise;
}
}
console.log(MyPromise.resolve(1).then(() => {}).someValue); // undefined
规范
| 规范 |
|---|
| ECMAScript® 2026 语言规范 # sec-get-promise-%symbol.species% |
浏览器兼容性
加载中…