Задать вопрос
@Khetag_d

Чем отличается функция от конструктора и где применять то или это?

Я не особо понимаю зачем нужны конструкторы если можно пользоваться функциями и реализовать тот или иной код с помощью функции без надобности вызова его через new
  • Вопрос задан
  • 1351 просмотр
Подписаться 1 Средний Комментировать
Решения вопроса 1
К большому моему (личному) сожалению, Javascript - это язык, в котором возможно и разрешено вообще всё. Язык постоянно дополняется из "хотелок" пользователей.

И вот в один момент разработчики спецификации ECMA-script решили, а давайте мы всё же оправдаем первые 4 буквы в названии языка, а именно "Java", и дадим пользователям сахарок, нарисованный над нашим прототипным наследованием, чтобы они могли везде писать class, extends и implements, как и все остальные ООП-динозавры. И сделали это.

И с этим решением в наш прекрасный язык пришло понимание конструктора, как метода, создающего экземпляр класса. Конструктор очень сильно помогает с инкапсуляцией. В языках, имеющих настоящий ООП, есть приватные поля, которые не могут быть инициализированы прямым присваиванием в какой-то внешней функции, создающей объект, потому что к ним нет прямого доступа, и для такого придётся писать публичные сеттеры. А это плохо, потому что кто угодно сможет менять при помощи этих сеттеров то состояние, которое менять не надо.
А вот из конструктора к приватным полям прямой доступ имеется. В Javascript приватные поля появились, кстати, вот буквально совсем недавно.

class ClassWithPrivate {
  #privateField;
  publicField;

  constructor() {
    this.#privateField = "Доступ только изнутри класса";
  }
}

const instance = new ClassWithPrivate();

instance.publicField = "Доступ извне класса";
instance.#privateField; // Ошибка: SyntaxError: Private field '#privateField' must be declared in an enclosing class


Еще одной особенностью конструктора является то, что он активно используется при наследовании (крестится и плюётся через левое плечо от отвращения). Если в дочернем классе не описан свой конструктор, то будет использован конструктор родителя. Это упрощает ООП.

class Animal {

  constructor(name) {
    this.speed = 0;
    this.name = name;
  }

  run(speed) {
    this.speed = speed;
    alert(`${this.name} бежит со скоростью ${this.speed}.`);
  }

  stop() {
    this.speed = 0;
    alert(`${this.name} стоит.`);
  }

}

class Rabbit extends Animal {
  hide() {
    alert(`${this.name} прячется!`);
  }

  stop() {
    super.stop(); // вызываем родительский метод stop
    this.hide(); // и затем hide
  }
}

let rabbit = new Rabbit("Белый кролик"); // используется конструктор родителя

rabbit.run(5); // Белый кролик бежит со скоростью 5.
rabbit.stop(); // Белый кролик стоит. Белый кролик прячется!


Таким образом, если вдарились в классический ООП, пользуйтесь везде конструктором, потому что ООП развивается десятилетиями, люди прошли сквозь страдания и выработали определённые "лучшие практики" для ООП.
Если же вы используете объекты в основном как очень простые структуры без классической инкапсуляции с приватными полями, не используете наследование, а весь ваш код написан, в основном, на функциях, то делайте, ради бога, что вам вздумается, и отдельная функция-фабрика для создания объектов - это тоже вариант.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
VoidVolker
@VoidVolker Куратор тега JavaScript
Dark side eye. А у нас печеньки! А у вас?
зачем нужны конструкторы если можно пользоваться функциями и реализовать тот или иной код с помощью функции без надобности вызова его через new

Да, можем. Точно так же можем записать всю программу в один файл и в одну функцию, в которой использовать простой goto. Вместо продуманной структуры классов. Как и не использовать фреймворки, стандартную библиотеку или можно для скорости работы программы писать её на ассемблере или даже машинных кодах сразу. Вместо простого и понятного кода в несколько слоёв абстракций, который понятен, легко сопровождается и позволяет не писать очередной велосипед в миллионный раз. Аналогично и с new Foo() - это просто всем понятная абстракция, говорящая "эта инструкция создаст объект такого-то класса и выполнит все необходимые инструкции для инициализации объекта". Думаю, мысль вполне ясна и детального объяснения не требует?
Ответ написан
Комментировать
@artem-dainov
Php, java, js. Boot spring, jquery, git
Мой первый изученный язык был php. я долго не мог въехать в ооп. Мне была не понятна философия данного момента.
Но когда я его понял, меня будто огрели кирпичом. тогда начался процесс переписывания всех моих проектов на ооп.
После я познакомился с java. Для кого-то это страх, а для меня песня.
В js стараюсь применять ооп, где можно. А можно почти не где. Ибо новые тренды говорят о том, что функциональное программирование круче, чем использовать ооп.
Не, когда мы создаём функцию, а в ней создаём объект с методами, можно сказать, что на выхлопе получаем тоже ооп. Но ведь это какое-то псевдо ооп. Так что конструкторы нужны как и функции. Классы позволяют разделить четкую ответственность, когда функции привносят бардак в проект. особенно функции вложенные в функции.
Ответ написан
Комментировать
S_gray
@S_gray
Разработчик Metropark Ltd. Israel
Собственно, конструктор нужен для того, чтобы выделить память под объект. Скорее всего, это общее правило для всех ОО-языков (а иначе, зачем он нужен?). И этим он и отличается от других функций - именно он физически создаёт экземпляр класса. Как конструктор заменить любой другой функцией - непонятно, ибо обратиться к экземпляру класса можно только создав его с помощью конструктора. Ну, это если мы вообще говорим об ООП.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
14 дек. 2024, в 07:35
500 руб./за проект
14 дек. 2024, в 05:57
50000 руб./за проект
14 дек. 2024, в 02:49
500 руб./за проект