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
相关产品推荐
相关产品推荐

