在不使用 Object.setPrototypeOf 的情况下设置构造函数的原型?

我一直在研究在 Node.JS 应用程序中处理模型的类似 ORM 的方法,我对它的工作方式感到满意;但是,我想知道是否有更好的方法来处理重置构造函数的原型。


我想要的行为是这样的:


function Person(data) {

  for (const key in data) {

    this[key] = data[key]

  }

}


// setting methods and so on here


Person.findAll() // returns a list of all persons from the db

Person.findOne(id) // returns a person at that ID


const self = new Person(data) // creating a person object

self.save() // saves that object in the db

self.update(data) // updates person object

self.addFriend(id) // creates a record adding the given id as a friend

构造函数上有一些方法Person可以访问所有Person记录,而每个实例Person都有只影响该记录的方法。我是这样管理的:


const utils = (tablename) => ({

  findAll: () => dbHandler(`SELECT * FROM ${tablename}`),

  findOne: id => dbHandler(`SELECT * FROM ${tablename} WHERE id = $1`, [id]),

  // etc

})


Object.setPrototypeOf(Person, utils('people'));

.setPrototypeOf不是最好的使用方法;它的性能不是特别好。我想知道是否有更好的方法来处理这样的用例——例如,es6 类规范中是否有任何内容可以处理这个问题?(扩展类是不太什么我要找的,之间的区别Person.findAll()和self.update(data)对我很重要,我希望UTIL方法是在构造函数本身。)


编辑:在下面向贝尔吉大喊解决方案(“只需使用Object.assign”)......这是一个小演示:


const dbHandler = (string, arr) => console.log(string, arr)


function Person(data) {

  for (const key in data) {

    this[key] = data[key]

  }

}


const utils = (tablename) => ({

  findAll: () => dbHandler(`SELECT * FROM ${tablename}`),

  findOne: id => dbHandler(`SELECT * FROM ${tablename} WHERE id = $1`, [id]),

  // etc

})


Object.assign(Person, utils('people'));


Person.prototype.save = function() {

  console.log(`Saving person with data ${JSON.stringify(this)} to a totally real database`)

}


Person.findAll()

Person.findOne(1)


const self = new Person({

  name: 'j',

  class: 'wizard'

})

self.save()


皈依舞
浏览 142回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript