You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript类构造函数中如何将同类型实例绑定到this?

错误原因

JavaScript/TypeScript 中this是构造函数执行时的只读上下文引用,不允许直接对this做赋值操作,这就是你遇到第一个报错的根本原因。
其次你对API的使用存在错误:Function.prototype.bind仅用于修改函数执行时的this指向,返回值是绑定后的新函数,完全不适用对象属性合并/实例替换的场景,因此会得到不符合预期的空对象。

正确实现方案

方案1:属性拷贝到当前实例(适合仅需要合并实例属性的场景)

如果processObject返回的只是带业务属性的普通对象,没有自定义原型方法,可以直接用Object.assign将新生成对象的所有可枚举属性拷贝到当前this实例上:

constructor(){
  let obj = this.processObject(this.getChildConstructor())
  Object.assign(this, obj)
}

方案2:构造函数显式返回新实例(适合需要完整替换实例的场景,最贴合你的需求)

JavaScript 原生支持构造函数显式返回非原始类型对象,此时new操作符最终返回的就是你显式返回的对象,而非原始创建的this实例,可完整保留新实例的原型链、私有属性、方法:

abstract class Foo<T>{
    private getChildConstructor(): {new (): T} {
      return this.constructor as {new (): T};
    }

    private processObject(cls: {new (): T}): T{
      // 你的原有逻辑,返回T类型实例
      return new cls();
    }

    constructor(){
      let obj = this.processObject(this.getChildConstructor())
      // 显式返回新实例替换原始this
      return obj as this;
    }
}

注意事项

  • 方案2返回的实例会完全替代new关键字创建的原始实例,子类继承Foo时,子类实例化得到的也会是父类构造返回的对象,需确保该逻辑符合你的业务预期。
  • 如果processObject返回的只是普通数据对象,没有自定义的原型方法,用方案1的Object.assign会更轻量。

内容的提问来源于stack exchange,提问作者Constantin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 23:24:04