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