JavaScript super.constructor () выдает «необходимо вызвать перед доступом к этому» исключению - PullRequest
1 голос
/ 27 января 2020

Я пытаюсь получить класс в JavaScript. В основном у меня есть класс Auth (больше похожий на интерфейс) и класс UserLogin, который расширяет его. Проблема в том, что я получаю это исключение, хотя я звоню super.constructor() раньше всего:

/Users/octav/Documents/work/framework-one/framework/server/src/user_login.js:12
        super.constructor(server);
        ^

ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor
    at new UserLogin (/Users/octav/Documents/work/framework-one/framework/server/src/user_login.js:12:3)
    at Object.<anonymous> (/Users/octav/Documents/work/framework-one/framework/server/app.js:8:14)
    at Module._compile (internal/modules/cjs/loader.js:955:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:991:10)
    at Module.load (internal/modules/cjs/loader.js:811:32)
    at Function.Module._load (internal/modules/cjs/loader.js:723:14)
    at Function.Module.runMain (internal/modules/cjs/loader.js:1043:10)
    at internal/main/run_main_module.js:17:11

Базовый класс:

/*
 * Generic authentication class
 */

const ServerError = require("./server_error.js");

class Auth {

    constructor(server) {
        if (server === undefined || typeof("server") !== "object")
            throw new ServerError("Bad type or missing argument 'server'");
        this.server = server;
    }
...

Класс UserLogin - как вы Я вижу, я не звоню this до вызова супер-конструктора.

/*
 * User Login class
 */

const Auth = require("./auth.js");

const ServerError = require("./server_error.js");

class UserLogin extends Auth {

    constructor(server, config) {
        super.constructor(server); // <== This is where the error is triggered

        if (config === undefined || typeof(config) !== "object")
            throw new ServerError("Missing config or bad type");
        if (config.endpoints === undefined || typeof(config.endpoints) !== "object")
            throw new ServerError("Missing config.endpoints or bad type");
        if (config.endpoints.login === undefined || typeof(config.endpoints.login) !== "object")
            throw new ServerError("Missing config.endpoints.login or bad type");
        if (config.endpoints.logout === undefined || typeof(config.endpoints.logout) !== "object")
            throw new ServerError("Missing config.endpoints.logout or bad type");

        this.endpoints = config.endpoints;
    }
...

Мой сценарий запуска:

const Server = require("./src/server.js");
const UserLogin = require("./src/user_login.js");

const config = require("./config.json");

const server = new Server(config);

const auth = new UserLogin(server, config.login); // <== This is where the error is triggered

server.setAuth(auth);

server.start();

Я пытался искать ответы в Интернете, но все, что я могли бы найти страницы о том, как получить классы в JavaScript.

Есть идеи?

1 Ответ

2 голосов
/ 27 января 2020

Внутри конструктора класса UserLogin необходимо вызвать super () first:

class UserLogin extends Auth {
    constructor(server, config) {
        super(); // you're missing this

        super.constructor(server);

        // ...
    }
}
...