gpt4 book ai didi

javascript - 如何使用 Babel 和 ES6 正确地子类化 Promises

转载 作者:行者123 更新时间:2023-11-29 23:33:34 26 4
gpt4 key购买 nike

通常使用 ES6 类,很容易组合类,例如

class A extends B { /*...*/ }

当谈到像 Promises 这样的原生内置类时,尽管很多文章建议避免子类化。 Babel 本身无法转译 such use cases .是否有可能以某种方式正确地转换子类甚至调整下面的示例?

PS 我正在使用 Rollup 和 ES2015 preset并尝试通过管道传输 transform-builtin-classes用我的 .babelrc

class P extends Promise {
foo(func) {
return this.then(func)
}
static bar(a) {
return a
}
}

最佳答案

ES5 中的内置类继承存在一些障碍,有时可以通过结合使用 Reflect.constructObject.setPrototypeOf 作为解决方法来避免这些障碍。这是 Babel 使用的方法 transform-builtin-classes .

此方法是否适用取决于内置类的工作方式。在 Promise 的情况下,这可能需要额外的从内置继承的中间类,然后可以使用常规 class ... extends 继承它。

function _P(executor) {
return Reflect.construct(Promise, [executor], P);
}

Object.setPrototypeOf(_P, Promise);
_P.prototype = Object.create(Promise.prototype);

class P extends _P {
static bar(arg) {
return new this(resolve => resolve(arg));
}

foo(...fns) {
return this.then(...fns);
}
}

这建立了correct prototype chain .这种方法的缺点是它被硬编码到 P 子类,这将很难进一步扩展。

一个更简洁的方法是让中间类包装内置类实例。这需要在中间类中复制原始类 API,但由于它很小,对于没有限制的原型(prototype)链来说,这是一个可以接受的权衡:

function _P(executor) {
this._promise = new Promise(executor);
}

Object.setPrototypeOf(_P, Promise);
_P.prototype = Object.assign(
Object.create(Promise.prototype),
{
then(...args) {
return this._promise.then(...args);
},
...
}
);

class P extends _P { ... }

请注意,此功能已通过 promise ponyfills 提供。已经,包括mapSeries .将它们用作自包含的辅助函数通常是 P 子类的更可取的替代方案,考虑到每个原生 promise 都应该使用 P.resolve< 转换为 P promise 以便从附加功能中受益。

关于javascript - 如何使用 Babel 和 ES6 正确地子类化 Promises,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46742440/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com