我一直在研究在 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()
相关分类