есть у кого-то нормальная статья или видео про абстракции в ООП, пытаюсь в этом разобраться, везде примеры с машинками
Чтобы хорошо понять ООП, нужно сравнить его не с ООП. И лучше не в терминах js (язык тут вообще не при чем).
Начнем с самого простого случая. Мы ведь знаем что там в компе есть железяка, которая умеет выполнять команды (процессор). И наверное нам рассказывали, что код, который мы пишем на таких языках как js (а лучше вспомнить С или С++, потому что в случае с js и другими современными языками мы натыкаемся на уровень абстракции под названием "виртуальная машина") процессором не выполняется на прямую. То есть язык, который понимает процессор отличается от языка, которым нам удобно писать. Написали программу, произошла магия, и процессор начал понимать что мы с него хотим и вести себя как мы написали. Нашу программу перевели на понятный ему язык. Как же он ее выполняет? Пропустим все подготовительные этапы, и перейдем к самому выполнению программы. Где-то в оперативной памяти загружен код, процессор берет из памяти одну инструкцию (это не то что мы написали в программе изначально на понятном нам языке, а переведенная версия для процессора, он не умеет в сложные команды, поэтому одна наша функция в переведенная на процессорный язык занимает несколько инструкций процессора), выполняет ее, потом берет следующую и т.д. Таким образом он работает всегда. Но как же тогда возможно при каком-либо условии выполнить одну функцию, а при другом - другую? Процессор читает инструкции последовательно, мы же не можем разместить в памяти 2 функции на одном и том же месте. Это реализовано следующим образом: в процессоре есть специальная ячейка памяти, которая указывает какую инструкцию выполнять дальше. Процессор дошел до места с условием, проверил его, а в зависимости от результата записал в эту память номер нужной инструкции, и пошел выполнять работу дальше.
Как видно, функции и ветвления реализовать можно, но если мы пишем прямо языком процессора, то все эти функции и ветвления для нас существуют только у нас в голове (если писать на том же ассемблере). Следующим витком стала разработка программ, которые будут писать машинный код вместо нас, а мы будем оперировать таким понятием как функция. Функции выполняют действия, и мы пишем функции с мыслями о том, какие действия они будут выполнять. Потом мы складываем простые функции в более сложные, чтобы выполнять все более сложные действия. Такой подход назван функциональным.
Дальше люди подумали, и поняли что можно делать немного по-другому. Функциональное программирование не сильно отличается от того, что понимает процессор. Ну взяли мы части кода и дали им имена, чтобы потом заставлять процессор перескакивать по коду в нужные нам места, а не писать один и тот же код каждый раз как нужно выполнить одно и то же действие, и что с того?
Ну вот подумали, и поняли что можно сделать по-другому. Если посмотреть на окружающий нас мир, то мы увидим, что он состоит из объектов. Например, стол за которым кто-то сидит — это объект. Да и тот кто за ним сидит, и то, на чем сидит — тоже объект. У стола есть цвет, есть материал из которого он сделан, у человека за столом есть какой-то цвет волос, форма носа, рост, вес, настроение и тому подобные параметры — свойства объекта. А еще, человек за столом может что-то делать. Он может говорить, может писать, может встать и пойти и тому подобное. То, какие действия выполняет объект — это его поведение. Поведение зависит от свойств объекта. Например, если человек расстроен, он вряд-ли будет весело о чем-то рассказывать. И вот оказалось, что если это перенести в код, то это довольно удобно. Мы теперь оперируем объектами, которые по свойствам и функциям не зависят друг от друга (очевидно что человек отличается от того же стола). Что еще более удобно, так это то, что объектов одного типа, но с разными свойствами может быть несколько (в функциональном стиле мы могли бы создать функцию, которая в зависимость от какого-то переменного состояния может вести себя по-разному, но функция всегда будет одна, либо же придется дублировать эту функцию и дать ей другое имя). То есть если в функциональном программировании у нас функция — именованная обертка над группой других