首页 > 解决方案 > 我可以在我的类构造函数中调用一个与构造函数具有相同参数的函数吗?

问题描述

有很多关于构造函数和函数的问题,但似乎没有人回答这个确切的问题。

我知道 JS 中的这个“this”关键字存在问题,但我不确定我知道如何绕过这些限制。

我已经定义了一个类,它将一个对象作为构造函数参数,然后循环该对象并将它们分配给类属性。

然后我想扩展这些类并调用相同的构造函数,但稍作改动。我的目标是拥有一个init(obj)由每个构造函数调用的函数。

class Thing {
  constructor(obj) {
    init(obj) 
  }
}

无论如何,这就是我的目标。我将有大量要扩展的类。这是我当前对前四个课程的冗余设置。

class Thing {
    constructor(obj) {
        for(let i in obj) this[i]=obj[i];
        if(!Data[obj.type]) Data[obj.type] = [];
        if(Data[obj.type]) Data[obj.type].push(this);
    }
}
class Role extends Thing {
    constructor(obj) {
        super();
        for(let i in obj) this[i]=obj[i];
        if(!Data[obj.type]) Data[obj.type] = [];
        if(Data[obj.type]) Data[obj.type].push(this);
    }
}

所以我的问题是:我将如何减少构造函数的重复性?

标签: javascriptclassoop

解决方案


这可能会帮助你。

var Data = {}
class Thing {
  constructor(obj) {
    this._setFields(obj)
  }
 // you can overwrite this function in child classes
  _setFields(obj) {
    for (let i in obj) this[i] = obj[i]
    this._setType(obj.type)
  }
  // you can overwrite this function in child classes 
  _setType(type) {
    if (!Data[type]) {
      Data[type] = [this]
    } else {
      Data[type].push(this)
    }
  }
}
class Role extends Thing {
  constructor(obj) {
    super(obj)
  }
}

const r1 = new Role({ type: 'role', id: '1' })
const r2 = new Role({ type: 'role', id: '2' })
const t1 = new Thing({ type: 'ting', id: '10' })

console.log(Data)

推荐阅读