Как правильно экспортировать два класса в один файл index.js, используя Javascript - PullRequest
0 голосов
/ 09 октября 2019

У меня есть два разных класса:

Class1.js

class Class1 { 
    initialize = () => {
        console.log("Class1 Initializer");
    }
}

export default Class1;

Class2.js

class Class2 { 
    initialize = () => {
        console.log("Class2 Initializer");
    }
}

export default Class2;

classes / index.js

import Class1 from "./Class1";
import Class2 from "./Class2";

export default { 
    Class1,
    Class2
}

Тогда я пытаюсь использовать классы:

server.js

import { Class1, Class2 } from "./classes";

...
Class1.initialize() <<<<==== ERROR - Cannot read property `initialize` of undefined.

Каков правильный синтаксис импорта и экспорта? Почему происходит эта ошибка?

Ответы [ 3 ]

0 голосов
/ 09 октября 2019

Соедините несколько вещей здесь.

Во-первых, вы используете синтаксис стрелки в своих методах класса. Функции стрелок не привязываются к своему собственному «this» так же, как обычные функции. Я бы рекомендовал рефакторинг этого кода для зеркала ниже. Сделайте то же самое для Class1 и Class2.

class Class1 {
    initialize() {
        console.log("Class1 Initializer");
    }
}

Два, если вы используете синтаксис экспорта ES6, у вас может быть только один по умолчанию. В вашем файле index.js вы захотите просто экспортировать {Class1, Class2}, но вы не можете использовать экспорт по умолчанию {Class1, Class2}.

Три, вам нужно создать экземпляркласс, прежде чем вы можете вызвать его метод. Вы можете либо создать новую переменную, которая инициализирует новый экземпляр класса, затем вызвать метод, либо вы можете сделать все это в строке.

new Class2().initialize();

В-четвертых, вы импортируете из файла с именемфайл с именем "./classes". Насколько я могу сказать, что не существует. Это должно быть из "./index".

Надеюсь, это поможет!

0 голосов
/ 09 октября 2019

Вы используете значение по умолчанию для литерала объекта. Вы не можете сделать это.

Выполните действия ниже в classes / index.js:

import Class1 from "./Class1";
import Class2 from "./Class2";

export { 
    Class1,
    Class2
}

и затем используйте:

import * as Classes from "./classes";

Затем:

new Classes .Class2().initialize();

Кстати, как работает пример выше? это как узел server.js ?? Узел 8.5.0 + поддерживает ES6, например, стиль импорта и экспорта, а расширение файла также должно быть .mjs , иначе для файла .js потребуется использовать требуется функция

0 голосов
/ 09 октября 2019

Насколько я понимаю, ваш метод экспорта возможен, и эта проблема вызвана тем, что initialize() является методом экземпляра Class1. Вам нужно будет создать экземпляр Class1 перед вызовом initialize(). Один из способов создания экземпляра Class1 будет через new:

import { Class1, Class2 } from "./classes";

// Create "new" instance of Class1, and then call initialize() on it
(new Class1()).initialize()
...