如何在ts类的方法中使用constructor?

为了更好表达问题,更改一下原描述

class Father{
    name: string
    constructor(name:string){
        this.name = name
        console.log(this.name)
    }
    copy(){
        return this.constructor(this.name)
    }
}
class Son extends Father {
    constructor(name:string){
        super(name)
        console.log(`i am son of ${name}`)
    }
    play(){
        console.log('play')
    }
}
let son = new Son('Bob')
let clone = son.copy()

如果像上面一样调用,编译时就会报需要用new调用constructor,如果将copy改为return new this.constructor检查的时候就直接报Function类型不能使用new,我的问题我继承的子类如何调用copy返回属于自己类的实例,如何能使这段代码正常工作呢?


下面代码改写了copy方法

class Father{
    name: string
    constructor(name:string){
        this.name = name
        console.log(this.name)
    }
    copy(){
        const F = this.constructor.prototype.constructor;
        return new F(this.name)
    }
}
class Son extends Father {
    constructor(name:string){
        super(name)
        console.log(`i am son of ${name}`)
    }
    play(){
        console.log('play')
    }
}
let son = new Son('Bob')
let clone = son.copy()

将copy方法中的this.constructor改写为this.constructor.prototype.constructor后,代码正常执行,两个函数应该是一样的,是什么导致这种差异?能给constructor上添加类型签名使得能够直接用前一种方法调用吗?

阅读 4.1k
3 个回答

Test.prototype.constructor本来是个类,它就是Test本身,只能用new调用,看下图

图片.png


copy(){
  const F = this.constructor.prototype.constructor;
  return new F(this.name)
}

你直接 return new Test() 不就行了

我理解的是父类 Father 有个 copy() 实例方法,可以返回一个新的 Father 实例。并且当子类继承 Father 时,copy 方法会返回新的子类实例?

class Father {
  name: string
  constructor(name: string) {
    this.name = name
  }
  copy() {
    const proto = Object.getPrototypeOf(this)
    return new proto.constructor(this.name)
  }
}

class Child extends Father {
  constructor(name: string) {
    super(name)
  }
  log() {
    console.log(this.name)
  }
}

const f = new Father('father')
const fc = f.copy() // fc is a Father
console.log('fc', fc)

const son = new Child('son')
const sonc = son.copy() // sonc is a Child
console.log('sonc', sonc)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进