помогите новичку!
есть описание класса - ну очень уж большое.
как можно его покоцать по файлам? 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, время: 18:58. |