помогите новичку!
есть описание класса - ну очень уж большое.
как можно его покоцать по файлам? class popandos{ function1(){} // в этом файле function2(){} // в другом файле } причем нужно понимать что this у них при использовании един, и возможны перекрестные вызовы.... можно конечно require. Но если за this можно уследить то перекрестные вызовы членов класса - капец полный. I need a help !!! |
Цитата:
const test = require('./test') class Tmp { constructor(name) { this.name = name this.test = test } home() { console.log(this.name) } } const o = new Tmp('Вася') o.home() o.test() test.js function test() { console.log(this.name) } module.exports = test |
направление понятно
экспорт из test.js нужно делать не функцию, а структуру в которой ключам соответствуют функции (по причине того, что в файле test.js) может находится большее количество функций). Экспортировать их поименно и затем поименно присваивать все функции в конструкторе не совсем хорошая идея. таким образом - каждый файл экспортирует все свои функции посредством структуры. Основной файл в конструкторе их присваивает внутри класса. При использовании при таком варианте немного изменится вызов. Он будет осуществляться не через this а this.test.func Ну и ладно. В принципе перекрестные вызовы (если таких файлов несколько и нужно сделать вызов из test.js в test1.js) тоже могут быть осуществлены через this. Остается еще один вопрос: Этот класс родительский многим объектам. Там от sql до работы по нестандартным протоколам (много чего). Но все подобные модули собранные в этом классе реализованы в режиме возможной "одновременной работы". Т.е. при наличии незаконченного выполненного одного действия допускаются повторные вызовы. При создании конечного объекта создаются множество других объектов всяких сокетов, sqэлев, телнетов и прочее. Конечный объект востребован каждый раз как поступает входящий запрос на некую операцию. Запросов таких много и поступают они асинхронно. Чтобы на каждый такой запрос не создавать монструальноый new - конечный класс создается как global.Myclass = new .... Т.е. - один объект и его this глобальный. Чтобы при таком подходе отделять данные разных запросов в точках входа обработки запроса создется new структура, она вначале может быть проинициализирована в зависимости от запроса и собственно она дальше и является this для всей цепочки работы. Передается она в виде первого параметра. Ну а this нигде не используется. Так вот вопрос - можно ли каким то образом сделать эту структуру полноценным this. т.е. перенести в нее функционал класса (из prototype) и везде дальше обращаться к данным через this, С учетом того что объект глобальный и вызовы асинхронные Спасибо |
Цитата:
Цитата:
Цитата:
Т.е. если у вас такое не будет получаться - значит что-то вы таки делали не правильно. :nono: :D |
Цитата:
Цитата:
|
Цитата:
const Def = require('./test') class Tmp { constructor(name) { this.name = name this.fn = Def this.fn.test = this.fn.test.bind(this) } home() { console.log(this.name) } } const o = new Tmp('Вася') o.home() o.fn.test() test.js const Def = { test: function (){ console.log(this.name) } } module.exports = Def |
про побочный эффект я написал при постановке вопроса. невнимательно читали. Закрываем тему. разберусь сам.
|
Цитата:
Цитата:
Я тут собираю проблемы таких как ты дабы потом так не делать и своим ребятам так делать не давать. ;) Т.ч. и от таких как ты есть польза в работе. Цитата:
|
понятно, - СЭНСЭЙ.
бедные ребята |
Цитата:
|
Кто то пытается переизобрести фабрики производящие классы объектов по необходимым параметрам и запросам.
Может поможет гугление в сторону "паттерн фабрика js"? |
Совсем "по правилам" надо так добавлять
test.js const methods = { function test() { console.log(this.name) } } module.exports = methods const methods = require('./test') class Tmp { constructor(name) { //.... } home() { //... } } methods.__proto__ = Tmp.prototype.__proto__ Object.defineProperty(Tmp.prototype, 'test', { writable: true, enumerable: false, configurable: true, value: methods.test, }); |
Для тех, кто может столкнуться с подобным вопросом:
Если погуглить задачу разбиения большого файла node.js на куски то все решения будут подобны предложенному варианту пана Проффэсора. Данный вариант технически работает, но эстетически дискомфортен и неприемлем. И большой массив инициализировать можно присваивая каждому элементу значение построчно. Теоретически - тоже работает. Ситуацию усугубляет тот факт, что JS не имеет множественного наследования. Поэтому получилось два варианта решения. Первый вариант: Разбиваем класс как вам удобно. Выносим функции во внешние файлы и связываем из последовательно цепочкой при помощи наследования proto например: test1.js class myClass{ function2(){} function1(){} } module.exports = myClass; test2.js const test1 = require('./test1.js'); class myClass{ __proto__: test1 function3(){} function4(){} } module.exports = myClass; main.js const test2 = require('./test2.js'); class myClass{ __proto__: test2 function5(){} function6(){} } Обратите внимание, что во всех файлах имя класса остается такое же как у класса в основном файле. Тот же самый вариант получился если бы мы задействовали extends: test1.js class myClass{ function2(){} function1(){} } module.exports = myClass; main.js const test1 = require('./test1.js'); class myClass extends test1{ constructor(){ super( ); // -- здесь обязательно вызывается конструктор дочернего объекта } function5(){} function6(){} } В этом варианте единственный недостаток - последовательная цепочка разбивки может быть логически несостоятельна. Например функции работы с смс сообщениями будут наследовать класс работы с консолью линукс машины и т.д. Поэтому для меня данный метод тоже не подошел. Есть второй вариант - использовать примеси. Причем есть задумка делать подключение блоков функции "по требованию". Если же класс функционально однороден - то первый метод найболее подходит. Надеюсь кому то может пригодиться. Спасибо |
fxobject,
Пожалуйста, отформатируйте свой код! Для этого его можно заключить в специальные теги: js/css/html и т.п., например: [html run] ... минимальный код страницы с вашей проблемой [/html] О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting. |
Часовой пояс GMT +3, время: 19:40. |