Javascript 我应该如何在JS类中声明属性?
我目前正在开发一个API,我想创建一个类,一个从表中检索数据的类Javascript 我应该如何在JS类中声明属性?,javascript,node.js,class,Javascript,Node.js,Class,我目前正在开发一个API,我想创建一个类,一个从表中检索数据的类Object,以及一个与表关联的类。我试图在对象类中创建一个属性,该属性是在从与表关联的类调用静态方法get()时设置的。我应该如何使用属性 我的API是用express运行的,我在Ubuntu 19.04上,我使用ObjectionJS作为我的ORM,我也使用Knex。我有一个loader.js文件,它需要我所有的模型文件 Object.js: “严格使用”; const dbTables=require('../../src/d
Object
,以及一个与表关联的类。我试图在对象
类中创建一个属性,该属性是在从与表关联的类调用静态方法get()
时设置的。我应该如何使用属性
我的API是用express运行的,我在Ubuntu 19.04上,我使用ObjectionJS作为我的ORM,我也使用Knex。我有一个loader.js
文件,它需要我所有的模型文件
Object.js:
“严格使用”;
const dbTables=require('../../src/database/Models/loader');
module.exports=类对象{
构造函数(){
console.log('Test');
}
//获取查询
静态get(){
log(`ModelName=${this.ModelName}`);
const req='dbTables.+this.modelName+'.query()';
返回评估(req);
}
}
UserClass.js:
“严格使用”;
const Object=require(“./Object”);
module.exports=类UserClass扩展对象{
构造函数(){
超级(“员工”);
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)
ModelName=未定义
TypeError:无法读取未定义的属性“query”
在eval时(在get时eval(/home/usersio/SafiAPI/src/Classes/Object.js:17:16),:1:20)
在Function.get(/home/usersio/SafiAPI/src/Classes/Object.js:17:16)
在app.get(/home/usersio/SafiAPI/index.js:54:28)
在Layer.handle[作为handle\u请求](/home/usersio/SafiAPI/node\u modules/express/lib/router/Layer.js:95:5)
下一步(/home/usersio/SafiAPI/node_modules/express/lib/router/route.js:137:13)
在Route.dispatch(/home/usersio/SafiAPI/node_modules/express/lib/router/Route.js:112:3)
在Layer.handle[作为handle\u请求](/home/usersio/SafiAPI/node\u modules/express/lib/router/Layer.js:95:5)
at/home/usersio/SafiAPI/node_modules/express/lib/router/index.js:281:22
在Function.process_参数(/home/usersio/SafiAPI/node_modules/express/lib/router/index.js:335:12)
下一步(/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)
在Layer.handle[作为handle\u请求](/home/usersio/SafiAPI/node\u modules/express/lib/router/Layer.js:95:5)
在trim_前缀(/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
在Function.process_参数(/home/usersio/SafiAPI/node_modules/express/lib/router/index.js:335:12)
下一步(/home/usersio/SafiAPI/node_modules/express/lib/router/index.js:275:10)
您的问题是因为您的函数get()
是静态的,您试图在其上获取此.modelName
。
但是静态函数并不引用它的特定实例
让我们看一些例子:
const dbTables={
雇员:{query:()=>['1','2','3']},
Car:{query:()=>['A','B','C']},
}
类抽象表{
//获取查询
静态get(){
log(`get():`,{this:this,model:this.modelName});
返回dbTables[this.modelName]
&&dbTables[this.modelName].query()
||无效;
}
//相同但非静态
getNonStatic(){
log(`getNonStatic():`,{this:this,model:this.modelName});
返回dbTables[this.modelName]
&&dbTables[this.modelName].query()
||无效;
}
//带args的静态
静态getWithArg(表){
log(`getWithArg(table):`,{this:this,model:table.modelName,table:table});
返回dbTables[table.modelName]
&&dbTables[table.modelName].query()
||无效;
}
}
类UserTable扩展了AbstractTable{
构造函数(){
超级(“员工”);
this.modelName='Employee';
}
};
console.log(“--test1--”;
console.log(UserTable.get());//get()是静态的,因此没有实例(未定义)
console.log(“--Test 2--”);
//创建UserTable的实例:
const userTable=new userTable();
console.log(“函数:”,userTable.get);//由于get()是静态的,因此未定义此项
console.log(“--Test 3--”);
log(“函数:”,userTable.getNonStatic);
console.log(“结果:,userTable.getNonStatic());//由于get()是静态的,因此未定义此项
console.log(“--Test 4--”);
//您还可以使用static和注入UserTable
log(“函数:”,AbstractTable.getWithArg(userTable))代码>您的问题是因为您的函数get()
是静态的,您试图在其上获取this.modelName
。
但是静态函数并不引用它的特定实例
让我们看一些例子:
const dbTables={
雇员:{query:()=>['1','2','3']},
Car:{query:()=>['A','B','C']},
}
类抽象表{
//获取查询
静态get(){
log(`get():`,{this:this,model:this.modelName});
返回dbTables[this.modelName]
&&dbTables[this.modelName].query()
||无效;
}
//相同但非静态
getNonStatic(){
log(`getNonStatic():`,{this:this,model:this.modelName});
返回dbTables[this.modelName]
&&dbTables[this.modelName].query()
||无效;
}
//带args的静态
静态getWithArg(表){
log(`getWithArg(table):`,{this:this,model:table.modelName,table:table});
返回dbTables[table.modelName]
&&dbTables[table.modelName].query()
||无效;
}
}
类UserTable扩展了AbstractTable{
构造函数(){
超级(“员工”);
this.modelName='Employee';
}
};
console.log(“--test1--”;
console.log(UserTable.get());//get()是静态的,因此没有insta
class Test {
constructor() {
console.log('ctor called');
}
}
const instance = new Test();
// will log 'ctor called'