Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我应该如何在JS类中声明属性?_Javascript_Node.js_Class - Fatal编程技术网

Javascript 我应该如何在JS类中声明属性?

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

我目前正在开发一个API,我想创建一个类,一个从表中检索数据的类
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'