Es6 родительский класс переопределяет дочерний прототип

Я решил написать класс ES6 для сервера Express, но расширенный Express переопределяет дочерний прототип, и нет возможности использовать методы и свойства, определенные вне конструктора. Смотрите код:

import Express from 'express'
export default class Server extends Express {
    constructor(options) {
        super(options.expressOptions || {})
        super.use(cookieParser()) // TypeError: (intermediate value).use is not a function
        this.use(bodyParser.json()) // This definition works cause of overridden prototype
        this.use(Express.static('static'))

        this.test() // TypeError: this.test is not a function
        this.test1 = '123' // Contains in Server final prototype
    }
    test() {
        console.log('test')
    }
}

И проблема с определением суперкласса. Я не знаю, как сохранить дочерний прототип. Будет очень ценно, если вы поможете.

Что такое Express?

Bergi 26.10.2018 08:53

@Bergi, я обновил эту тему, Express - это зависимость от npm, фреймворк веб-сервера.

Alexey S. 26.10.2018 09:00

Могу ошибаться, но эта ошибка часто возникает из-за правил автоматической вставки точки с запятой. Можете ли вы попробовать поставить точку с запятой после каждого оператора в конструкторе?

lonesomeday 26.10.2018 09:25

@lonesomeday, когда я создаю проект, точка с запятой вставляется автоматически, это правда. И я тоже пробовал ваше решение, но это не помогло.

Alexey S. 26.10.2018 09:35

@AlexeyS. Хорошо, я не знал, что пакет express экспортирует свой конструктор ...

Bergi 26.10.2018 10:17

@Bergi Нет, и это действительно проблема. (Я только что проверил!)

lonesomeday 26.10.2018 10:18
1
6
133
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Посмотрев еще раз на это, я вижу проблему.

express не является конструктором.

Вы обрабатываете express, как если бы это был конструктор, который вы вызываете с помощью new Express. Это не так: вы просто вызываете его, например, с помощью const app = express(). Фактически, express - это функция (вот исходный код), которая создает объект для вас старомодным (не-ES6) способом.

Насколько мне известно, невозможно создать подкласс каких-либо основных объектов Express. Думаю, вы могли бы использовать классы для обертывания объектов инфраструктуры Express, но мне это не кажется интуитивно понятным.

Да: function SubclassibleExpress(...args) { return Object.setPrototypeOf(express(), new.target.prototype); }

Bergi 26.10.2018 12:10

Другие вопросы по теме