OOP is just another way to organize code, and has its place. I’ve found peace with myself by adopting a minimalist use of OOP, namely just sticking with encapsulation (which is everywhere BTW, functions have scope too), separating classes for data (i.e. transport classes or models) and actions, and preferring composition over inheritance.
It shows that you can model class-style inheritance IS-A relationships using concatenation. You can do the same with delegate prototypes, too, which is what happens when you use `class…extends`.
But the example is not a good example of composition done right. You can drive off a cliff in any model car.