Babel.js 巴别塔没有正确传递类扩展

inkz8wg9  于 2022-12-08  发布在  Babel
关注(0)|答案(1)|浏览(179)

考虑下面的代码

class Test1 {
    emit() {
        console.log(2)
    }
}

class Test extends Test1 {
    test() {
        console.log(1);
    }
}

const a = new Test();
a.test()

巴别塔把这个代码翻译成这个
这在现代浏览器上运行得很好,但在Firefox43上就不行了

TypeError: a.test is not a function

我意识到:

  1. Babel将类扩展为Reflect.construct(如果平台支持Reflect)或上下文绑定
  2. Firefox43上的Reflect.construct(Super,arguments,NewTarget)跳过了NewTarget的原型
    1.我们可以使用Reflect.construct将这个类扩展为以下形式:
const test = {};
test.__proto__ = {
    test() {
        console.log(1);
    },
};

function Super() {
    this.emit = function () {
        console.log(2);
    };
}

function Target() {}

Target.prototype = test.__proto__;
const result = Reflect.construct(Super, [test], Target);
result.test();

此外,我在closure compiler中找到了声明“brokenConstruct”的代码。
它指的是this issue
我做错了什么?我应该怎么做才能解决这个问题?

ssm49v7z

ssm49v7z1#

我意识到这是火狐的bug。有来自core-js/modules/es的评论。

// `Reflect.construct` method
// https://tc39.es/ecma262/#sec-reflect.construct
// MS Edge supports only 2 arguments and argumentsList argument is optional
// FF Nightly sets third argument as `new.target`, but does not create `this` from it

相关问题