Этот вопрос является продолжением этого one, в котором рассматривается, как разбить файлы классов, когда экземпляр и статические методы становятся большими и делают один файл класса слишком громоздким для работы.
Этот вопрос нашел хороший ответ для методов экземпляра, но хороший ответ для статических фабричных функций все еще ускользает. Рассмотрим этот класс ES6:
const fnCreate = require('./create');
const fnInstanceMethod = require('./instanceMethod');
class Door {
constructor() {
this.species = 'Oak';
this.instanceMethod = fnInstanceMethod; // <-- works great
}
// Cannot connect static to required files...
static create = fnCreate; // Syntax error unexpected '='
// so static has to be written in class..
static create() {
return new Door(); // <-- the only line in fnCreate
}
}
module.exports = Door; // but it exports and works fine...
Вы можете видеть, где было бы очень приятно просто потребовать статическую функцию, но я не нашел способа сделать это с ES6; это должно быть реализовано в файле класса. Итак, вопрос 1 из 2: "Есть ли способ потребовать в фабричной функции и подключить ее статически в классах ES6?"
Эта «неспособность» ES6 заставила меня переписать ES5 следующим образом:
const fnCreate = require('./create');
const fnInstanceMethod = require('./instanceMethod');
function Door() {
this.species = 'Oak';
this.instanceMethod = fnInstanceMethod; // <-- works great
}
Door.create = fnCreate; // <-- totally solves the file problem; works fine
module.exports = Door; // <-- NOPE! Node says "Door" is not a constructor"
Это позволяет избежать одной проблемы и перейти к другой. В «обычном» JS этот код работает нормально, а Door.create() возвращает новый объект Door. Но экспорт каким-то образом ломает реализацию, выдавая ошибку «Дверь не является конструктором». Вопрос 2 из 2: "Можно ли экспортировать приведенный выше код ES5, чтобы он работал правильно?"
"Door" is not a constructor"
ошибке jsfiddle.net/9d5xo7ac ЕслиfnCreate
находится в отдельном файле, не будет иметь область действияDoor
, поэтому я думаю, что ошибка будетUncaught ReferenceError: Door is not defined
при вызовеcreate()
(то естьfnCreate
) - person CertainPerformance   schedule 11.12.2018class
es - это более или менее просто синтаксический сахар.Door
— это функция, независимо от того, используете ли выclass Door {}
илиfunction Door() {}
. - person Felix Kling   schedule 11.12.2018