Разделение node.js расширений классов между файлами - PullRequest
1 голос
/ 09 января 2020

Я пытаюсь создать диссон-бота в node.js. У меня есть основной файл, бот. js, который содержит основной поток управления. Я хотел бы реализовать состояние мира как класс и разделить действия над этим классом на другие файлы. Однако я не совсем уверен, как это сделать, особенно в той части, где мне нужно рекомбинировать несколько файлов функций (давайте назовем их startup. js и b ios. js), расширяющих один и тот же класс.

Должен ли я иметь отдельный файл, который включает определение класса, чтобы я мог импортировать его в оба вспомогательных файла?

общий. js

module.exports = botState;

class botState {
    //class definition goes here
}

инициализировать. js

const common = require('./common');

class initializeState extends botState {
    constructor () {
        //it's a constructor; details not too important
    }

    function1 () {} //implementation not important

    function2 () {}
}

module.exports = initializeState;

символов. js

const common = require('./common');

class bioState extends botState {
    constructor () {
        //it's a constructor; details not too important
    }

    function3 () {} //implementation not important

    function4 () {}
}

module.exports = BioState;

бот. js

//main control flow is in this file
//I'd like to have a class that implements functions 1 through 4, but don't know how to do that.

Я не уверен, как реализовать бота. js. Для этого может быть какая-то лучшая конструкция.

1 Ответ

0 голосов
/ 09 января 2020

Звучит так, как будто вы пытаетесь сделать несколько множественных наследований, которые не поддерживаются в Javascript (см. Последний раздел здесь: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Details_of_the_Object_Model), либо в том же файле, либо в другом файлы.

Тем не менее, то, что вы можете сделать, это воспользоваться преимуществами работы системы прототипирования. Вы можете написать функции 1-4 отдельно от определений классов и присоединить их к прототипам нужных вам классов.

function function1(){
  this.someValue = this.someOtherValue + this.someMethod();
  return 7;
}
// ... and other functions

BioState.prototype.function1 = function1;
InitializeState.prototype.function1 = function1;

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

const { function1, function2 } = require('./common-functions');
class Blah {
//...
}
Blah.prototype.function1 = function1;
Blah.prototype.function2 = function2;
// You could also do this in the constructor as this.function1 = function1;

module.exports = Blah;
...