我目前正在开发一个 API,我想创建一个类,一个从表中检索数据的 Object
类,以及一个与表关联的类。我试图在 Object
类中创建一个属性,该属性是在从与表关联的类调用静态方法 get()
时设置的。我应该如何使用这些属性?
我的 API 使用 Express 运行,我使用的是 Ubuntu 19.04,我使用 ObjectionJS 作为我的 ORM,我还使用 Knex。我有一个 loader.js
文件,它需要我的所有模型文件。
对象.js:
'use strict';
const dbTables = require('../../src/database/Models/loader');
module.exports = class Object {
constructor () {
console.log('Test');
}
//Get queries
static get() {
console.log(`ModelName = ${this.modelName}`);
const req = 'dbTables.' + this.modelName + '.query()';
return eval(req);
}
}
UserClass.js:
'use strict';
const Object = require('./Object');
module.exports = class UserClass extends Object {
constructor() {
super('Employee');
this.modelName = 'Employee';
}
};
这是我收到的错误:
ModelName = undefined
TypeError: Cannot read property 'query' of undefined
at eval (eval at get (/home/usersio/SafiAPI/src/Classes/Object.js:17:16), <anonymous>:1:20)
at Function.get (/home/usersio/SafiAPI/src/Classes/Object.js:17:16)
at app.get (/home/usersio/SafiAPI/index.js:54:28)
at Layer.handle [as handle_request] (/home/usersio/SafiAPI/node_modules/express/lib/router/layer.js:95:5)
at next (/home/usersio/SafiAPI/node_modules/express/lib/router/route.js:137:13)
at Route.dispatch (/home/usersio/SafiAPI/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/home/usersio/SafiAPI/node_modules/express/lib/router/layer.js:95:5)
at /home/usersio/SafiAPI/node_modules/express/lib/router/index.js:281:22
at Function.process_params (/home/usersio/SafiAPI/node_modules/express/lib/router/index.js:335:12)
at next (/home/usersio/SafiAPI/node_modules/express/lib/router/index.js:275:10)
at methodOverride (/home/usersio/SafiAPI/node_modules/method-override/index.js:65:14)
at Layer.handle [as handle_request] (/home/usersio/SafiAPI/node_modules/express/lib/router/layer.js:95:5)
at trim_prefix (/home/usersio/SafiAPI/node_modules/express/lib/router/index.js:317:13)
at /home/usersio/SafiAPI/node_modules/express/lib/router/index.js:284:7
at Function.process_params (/home/usersio/SafiAPI/node_modules/express/lib/router/index.js:335:12)
at next (/home/usersio/SafiAPI/node_modules/express/lib/router/index.js:275:10)
最佳答案
您的问题是因为您的函数 get()
是静态的,并且您试图在其上获取 this.modelName
。
但静态函数并不引用它的特定实例。
让我们看一些例子:
const dbTables = {
Employee: {query : () => ['1', '2', '3']},
Car: {query : () => ['A', 'B', 'C']},
}
class AbstractTable {
//Get queries
static get() {
console.log(`get():`, {this:this, model: this.modelName});
return dbTables[this.modelName]
&& dbTables[this.modelName].query()
|| null;
}
// Same but non static
getNonStatic() {
console.log(`getNonStatic():`, {this:this, model: this.modelName});
return dbTables[this.modelName]
&& dbTables[this.modelName].query()
|| null;
}
// Static with args
static getWithArg(table) {
console.log(`getWithArg(table):`, {this:this, model: table.modelName, table:table});
return dbTables[table.modelName]
&& dbTables[table.modelName].query()
|| null;
}
}
class UserTable extends AbstractTable {
constructor() {
super('Employee');
this.modelName = 'Employee';
}
};
console.log("--- Test 1 ---");
console.log(UserTable.get()); // get() is static so NO instance (this is undefined)
console.log("--- Test 2 ---");
// Create an instance of UserTable:
const userTable = new UserTable();
console.log("Function:", userTable.get); // This is not defined because get() is static
console.log("--- Test 3 ---");
console.log("Function:", userTable.getNonStatic);
console.log("Result:", userTable.getNonStatic()); // This is not defined because get() is static
console.log("--- Test 4 ---");
// you can also use static and inject the UserTable
console.log("Function:", AbstractTable.getWithArg(userTable));
您还可以重新定义抽象静态函数并使用 super()
const dbTables = {
Employee: {query : () => ['1', '2', '3']},
Car: {query : () => ['A', 'B', 'C']},
}
class AbstractTable {
//Get queries
static get(modelName) {
return dbTables[modelName]
&& dbTables[modelName].query()
|| null;
}
}
class UserTable extends AbstractTable {
static get() {
return super.get("Employee");
}
}
console.log(UserTable.get());
关于javascript - 我应该如何在 JS 类中声明属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58769576/