我正在为knex.js编写一个简单的ORM /包装器,我试图在两种方法之间做出决定。
第一种方法只是一个必须在使用前实例化的常规类:
class Base {
constructor() {
this.db = db;
}
all() {
return this.db(this.table);
}
find(id) {
return this.db(this.table).where('id', id).first();
}
// more similar methods...
}
class User extends Base {
constructor() {
super();
this.table = 'users';
}
}
// calling code
let user = new User();
user.find(1).then(user => console.log(user));
我更倾向于使用的第二种方法使用创建实例的静态方法:
class Base {
constructor() {
this.db = db;
}
static all() {
const model = new this;
return model.db(model.table);
}
static find(id) {
const model = new this;
return model.db(model.table).where('id', id).first();
}
}
// calling code
User.find(1).then(user => console.log(user));
我喜欢静态方法,因为API更干净(无需实例化),但我不熟悉缺点。所以我的问题是这是一个好方法吗?如果没有,为什么?是否有第三种选择位于中间哪个更好?
答案 0 :(得分:0)
如果你想避开物体怎么样?
class Base {
constructor() { }
static all() {
return db(this.table())
}
static find(id) {
return db(this.table()).where('id', id).first()
}
}
class User extends Base{
constructor() {
super()
}
static table(){
return 'users'
}
}
// calling code
User.find(1).then(user => console.log(user));
这样可行,但我不知道这是做事的好方法,对于初学者来说,Base.all()
会抛出错误,如果所有的类方法都是静态的,你不妨使用普通的js对象如:
let Base = {
all: function(){
return db(this.table)
},
find: function(id){
return db(this.table.where('id', id).first()
}
}
, extend = (a,b) => {for(let i in b) a[i] = b[i]}
, User = {table: 'users'}
// calling code
User.find(1).then(user => console.log(user));