gpt4 book ai didi

javascript - 不使用 Object.setPrototypeOf 设置构造函数的原型(prototype)?

转载 作者:行者123 更新时间:2023-11-29 20:33:39 27 4
gpt4 key购买 nike

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

我想要的行为是这样的:

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 方法在构造函数本身上。)

编辑:向下面的 Bergi 大喊解决方案(“只需使用 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()

最佳答案

没有理由在这里涉及任何继承(设置构造函数的原型(prototype)使其不再继承自 Function.prototype 真的很奇怪)。只需将静态方法分配为 Person 构造函数对象的属性:

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

这与

具有相同的效果
function createUtils(obj, tablename) {
obj.findAll = () => dbHandler(`SELECT * FROM ${tablename}`);
obj.findOne = id => dbHandler(`SELECT * FROM ${tablename} WHERE id = $1`, [id]);
// etc
}
createUtils(Person, 'people');

关于javascript - 不使用 Object.setPrototypeOf 设置构造函数的原型(prototype)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57364132/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com