Виталий Бохин
953 сообщения
#4 года назад
Приветствую всех. Хочу узнать ваше мнение, нормально или нет, для общей практики, реализовывать метод вне класса? Есть код, который нужно выполнять в другом скоупе, управляя им из класса, и чтоб он был привязан к экземпляру класса. Для этого описываю метод снаружи, и вызываю его из класса.
function MyClass(){
// что-то делаем и передаем результат в наружный метод
this.extMth(data);
}

const mc = new MyClass();

mc.extMth = function (data) {
// code
}
Нормально ли так делать (работает как надо) или лучше применить другие механизмы, например события (nodeJs)?
Виталий Бохин
953 сообщения
#4 года назад
Забыл добавить важную деталь. Метод может "подключаться" на лету, во время исполнения кода в классе и должен выдавать текущее состояние счетчика, например. Можно реализовать немного по другому, чтоб не нарушать принцип инкапсуляции...

  1. function D() {
  2.    let i = 0;

  3.    setInterval(() => {

  4.       console.log('in', i);

  5.       if (this.cb) {
  6.          this.cb(i);
  7.       }

  8.       i++;
  9.    }, 2000);

  10.    this.o = (cb) => {
  11.       this.cb = cb;
  12.    }
  13. }

  14. const d = new D();

  15. setTimeout(function() {
  16.    d.o(function(r) {
  17.       console.log('out', r);
  18.    });
  19. }, 6000);
... но суть одна и та же, так проще вынести метод наружу, а нормально это или нет, чтоб не сказали, что гомнокод?
Елена Б.
6863 сообщения
#4 года назад
Цитата (lufter):
чтоб не сказали, что гомнокод
Все-равно скажут, хоть в лепешку разбейтесь ))) 
Андрей С.
10 сообщений
#4 года назад
lufter,
А почему вы так не создаете класс?

  1. class Rectangle { 
  2.  constructor(height, width) {
    this.height = height;
    this.width = width;
     }
    }
Classes ES6 - там же можно внутри класса создать функции, хотите статическую или можно обычный метод.

  1. class Rectangle { constructor(height, width) {
    this.height = height;
    this.width = width;
    }

    get area() {
    return this.calcArea();
    }

    calcArea() {
    return this.height * this.width;
    }
    }

Цитата (floppox):
Все-равно скажут, хоть в лепешку разбейтесь ))) 
Почему?
Андрей С.
10 сообщений
#4 года назад
function arrayForBar(size) 
{
   this.getRandom = function (minEl, maxEl) {
     return Math.random() * (maxEl - minEl) + minEl;
   }
}
Вы можете объявить внутри.
Елена Б.
6863 сообщения
#4 года назад
Цитата (Andrew_Fix):
Почему?
Потому что люди так устроены, что всегда найдут к чему придраться. 
Не существует такого кода, которым были бы довольны все. 
Особенно, если это javascript  
Цитата (Andrew_Fix):
Почему?
Потому что люди так устроены, что всегда найдут к чему придраться. 
Не существует такого кода, которым были бы довольны все. 
Особенно, если это javascript  
Андрей С.
10 сообщений
#4 года назад
Цитата (floppox):
Не существует такого кода, которым были бы довольны все. 
floppox
,
Похоже на какую то выжималовку. Типа хотят выгнать человека с работы и начинают придираться ко всему. Если говорить про норм компании то там нужно просто придерживаться стандартов.
Сидоров В.
918 сообщений
#4 года назад
А причем тут способ объявления классов?
Тут же спрашивают насколько кошерно прилеплять методы динамически (насколько я понял из Цитата:
Метод может "подключаться" на лету
)
Скажу от себя -  по мне это как-то стремновато и лучше передавать функцию как коллбек или в конструктор или в один из методов. Но в js что только не сделают.
Андрей С.
10 сообщений
#4 года назад
inter-job,
Цитата (inter-job):
в один из методов
Также думаю что это лучше.
Андрей Андреев
798 сообщений
#4 года назад
Наследование?
Андрей С.
10 сообщений
#4 года назад
b0nn1e,
Цитата:
Наследование?
Тоже об этом подумал.
Но у него обязательное условие - Цитата:
"подключаться" на лету, во время исполнения кода
Думаю калбек лучше.
Виталий Бохин
953 сообщения
#4 года назад
Цитата (inter-job):
Но в js что только не сделают.
Этим js и прекрасен и ужасен одновременно. Вы правы, стремновато, сделал через колбэк