我试图理解handbook中的一行:

在ES 2015中,返回对象implicitly的构造函数将值this替换任何super(...)的调用者.生成的构造器代码有必要捕获任何潜在的返回值super(...)并将其替换为this.

整句话对我来说都很模糊.有人能解释一下这里发生了什么吗?

推荐答案

super"函数调用"很奇怪.对于不返回对象的普通类,this只是正在构造的类的当前实例. 对super()的调用只是对同一this进行操作,因此最终构建的对象是该类别的实例:

class Foo {
    a = 10;
    constructor() { }
}

class Bar extends Foo {
    z: number;
    constructor() {
        super();
        this.z = 1;
    }
}

const b = new Bar();
console.log(b); // Bar: {a: 10, z: 1}
console.log(b instanceof Bar); // true

但如果超类从其构造函数返回一个值,那么子类中的this就会以某种方式成为该值.这允许后续对this的引用超类返回的同一对象.因此,除了所构造的对象实际上不是类的实例之外,该类别的行为"正常":

class Foo {
    constructor() {
        return { a: 10 };
    }
}

class Bar extends Foo {
    z: number;
    constructor() {
        super();
        this.z = 1;
    }
}

const b = new Bar();
console.log(b); // {a: 10, z: 1}
console.log(b instanceof Bar); // false

这意味着对super()的调用必须看起来像"像函数一样调用超类构造函数,并查看它是否返回任何内容".如果是,则将该函数的结果assign变为this. 好像你可以写

this = superCtor.call(this) || this;

但你不能这样做!您无法分配给this. 但无论如何它都会发生,implicitly. 如果您查看当存在class之前的JS版本的downleveling代码时调用超级构造器时会发生什么,您会看到类似的情况:

function Bar() {
    var _this = _super.call(this) || this;
    _this.z = 1;
    return _this;
}

您会看到实际的this已在各处被新的_this变量替换.

Playground link to code

Typescript相关问答推荐

创建一个通用上下文,允许正确推断其中的子项

如何在TypeScript对象迭代中根据键推断值类型?

键集分页顺序/时间戳上的筛选器,精度不相同

将对象属性转换为InstanceType或原样的强类型方法

异步动态生成Playwright测试,显示未找到测试

不推荐使用Marker类-Google map API警告

使用动态主体初始化变量

仅针对某些状态代码重试HTTP请求

如何在Angular 12中创建DisplayBlock组件?

以Angular 自定义快捷菜单

MatTool提示在角垫工作台中不起作用

在打印脚本中使用泛型扩展抽象类

API文件夹内的工作员getAuth()帮助器返回:{UserID:空}

将对象的属性转换为正确类型和位置的函数参数

有没有办法传递泛型类型数组,以便推断每个元素的泛型类型?

为什么我的函数arg得到类型为Never?

如何正确地将元组表格输入到对象数组实用函数(如ZIP)中,避免在TypeScrip 5.2.2中合并所有值

在 next.js 13.4 中为react-email-editor使用forwardRef和next/dynamic的正确方法

为什么我无法在 TypeScript 中重新分配函数?

解析错误:DeprecationError: 'originalKeywordKind' 自 v5.0.0 起已被弃用,无法再使用