@Igorek98

ООП в JS отличается сильно от ООП компилируемых языков?

Например, есть функция
function test() {
this.a = 10;
var b = 100;
}

Инкапсуляция это идёт речь о b, которая доступна только в пределах нашей функции, так?
И чем отличается замыкание от инкапсуляции?

Наследование это, если мы создадим экземпляр нашей функции var user = new test();
И тем самым user унаследует у нас a и user.a === 10, так?

Про полиморфизм я так понял, что в js он не существует, т.к. функции всё ровно, какие типы данных мы ей передаем, так?

Поправьте пожалуйста, если я не прав или что-то ещё забыл про ООП.

Уже не первый раз сталкиваюсь с этим вопросом и со своей стороны не могу понять, что от меня хотят, когда спрашивают про ООП в JS.
  • Вопрос задан
  • 281 просмотр
Решения вопроса 4
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
3 принципа ООП - это миф, притом очень вредный.
Инкапсуляция, наследование и полиморфизм относятся к ООП примерно как кухонный комбайн к варке блюд, их конечно можно использовать вместе, но и друг без друга они живут прекрасно.

ООП - это про высокоуровневые абстракции представленные в виде объектов, а так же про взаимодействие этих объектов, путем вызова методов. Все. Никаких 3 принципов тут нет. И это примерно одинаково, что в JS, что в C#, что в Java, что в C++, а разница в реализации тут не существенна, Вы о ней знаете, только потому что абстракции текут.

Инкапсуляция - это сокрытие сложности. Опять же все. Забудьте весь бред про приватные поля и тому подобное. Это не более чем частный случай. И замыкания - это тоже частный случай инкапсуляции. А еще, когда из модуля Вы экспортируете не все подряд (привет ReasonML), а только высокоуровневые штуки, оставляя все остальное недоступным извне. А еще когда некоторое API (REST/GraphQL/RPC/etc.) отгораживает Вас от прямого общения с базой данных - это тоже инкапсуляция.

Полиморфизм - это возможность некоторой сущности работать с разными типами данных и возможно адаптироваться под них. А еще полиморфизм разный бывает. Помимо полиморфизма подтипов, который чаще всего и приписывают к ООП, бывают и другие. Например очень распространен параметрический полиморфизм, в большинстве языков представленный дженериками. А еще бывает ad-hoc полиморфизм (перегрузки).
Но даже если рассматривать только полиморфизм подтипов (это когда между типами есть иерархия, то есть отношения подтип-надтип, и мы в переменную/аргумент/поле надтипа можем присвоить значение подтипа), то и тут нет не слова про ООП. Яркий пример - TypeScript, где есть тип unknown, являющийся надтипом любого другого типа и в который можно присвоить значение любого типа, а так же есть тип never, являющийся подтипом любого другого типа и который можно присвоить в любой другой тип.
Ну и касательно JS, в нем вообще все полиморфно, ибо динамическая типизация.

Наследование - это вообще частный случай полиморфизма подтипов, отдельно выделяют пожалуй лишь потому, что он не только про типы (как полиморфизм), а еще и про реализации, которые наследуются. И опять же, ничего тут про ООП нет. Наследование вполне может жить и без ООП,
например во вполне себе структурно-процедурном Си
#include <stdio.h>

struct Parent
{
    int a;
    int b;
};

struct Child
{
    struct Parent __super;
    int c;
};

void f(struct Parent* v)
{
    printf("a: %d\nb: %d\n", v->a, v->b);
}

int main()
{
    struct Child v = {{10, 20}, 30};
    f((struct Parent*)&v);
    printf("c: %d\n", v.c);
    return 0;
}


P.S. JS вполне себе компилируемый язык, у v8 даже ассемблерный код попросить можно, который он накомпилит с Вашего JS.
Ответ написан
DevMan
@DevMan
ваще сильно: примерно как Валуев отличается от слона.

если без сарказма: классического ООП в жс нет. есть прототипное и разные попытки адаптировать его к классическому.
а всё остальное зависит только реализации ООП в конкретном языке и от собственного понимания ООП.
Ответ написан
saboteur_kiev
@saboteur_kiev
software engineer
Принципы ООП не зависят от языка. Принципы ООП в идеологии и подходу к разработке.

А конкретный синтаксис, терминология и техническая реализация в каждом языке немного своя, но сравнивать их отдельно, от общего синтаксиса языка - нет смысла.
Ответ написан
Комментировать
Открываешь Фленегана Подробное руководство Javascript, вроде уже есть 7-е издание, читаешь от корки до корки, там есть ООП.
https://www.oreilly.com/library/view/javascript-th...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы