Promise[Symbol.species]
**Promise[Symbol.species]
** 静态访问器属性返回用于构建 promise 方法返回值的构造函数。
**警告:** [Symbol.species]
的存在允许执行任意代码,并可能造成安全漏洞。它也使某些优化变得更加困难。引擎实现者正在 调查是否删除此功能。如果可能,请避免依赖它。
语法
Promise[Symbol.species]
返回值
调用 get [Symbol.species]
的构造函数 (this
) 的值。返回值用于构建 promise 链式方法创建的新 promise 的返回值。
描述
[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 对象。
示例
普通对象中的种类
Symbol.species
属性返回默认的构造函数,对于 Promise
来说,它是 Promise
构造函数。
Promise[Symbol.species]; // [Function: Promise]
派生对象中的种类
在自定义 Promise
子类的实例(例如 MyPromise
)中,MyPromise
的种类是 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 语言规范 # sec-get-promise-%symbol.species% |
浏览器兼容性
BCD 表格仅在浏览器中加载