为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

皈依舞 2021-09-04 17:29:48
我一直在研究在 Node.JS 应用程序中处理模型的类似 ORM 的方法,我对它的工作方式感到满意;但是,我想知道是否有更好的方法来处理重置构造函数的原型。我想要的行为是这样的:function Person(data) {  for (const key in data) {    this[key] = data[key]  }}// setting methods and so on herePerson.findAll() // returns a list of all persons from the dbPerson.findOne(id) // returns a person at that IDconst self = new Person(data) // creating a person objectself.save() // saves that object in the dbself.update(data) // updates person objectself.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()
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 141 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信