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

标签 javascript node.js class

我目前正在开发一个 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/

相关文章:

javascript - 在actioncreator/selector中获取路由参数?

javascript - 正则表达式 - 从字符串中捕获重复字符

javascript - 访问 OwnerTableView ParentItem

node.js - 允许输入中的对象对象处于事件状态

node.js - 当我与 Puppeteer(集群)交互时关闭页面

python - 如何将数据从一个类传递给另一个函数(在 HTMLParser 中)?

javascript - Firestore : Missing or insufficient permissions when trying to add a new subcollection

javascript - Puppeteer page.waitForNavigation() 超时错误处理

java - 代理的原始类名(没有手动字符串操作)

css - 制作链接类