@ron_man This is something I'm trying to learn more about as well. I've been exploring the Elm language, which is a purely functional object-oriented language and it has opened my eyes to some of the benefits. Essentially as I understand it, if your objects/functions are composable they are not reliant on one another.
However if your object extends another, it is now reliant on that previous objects API -- class A extends class B. Do this a couple more times and you've got class D extends class C (which extends class B, which extends class A. What if I make a change to class A? It starts to get hard to figure out if that's going to break the other 3 classes.
With composition I can say class D is composed of class A, class B, class C. It doesn't inherit from any of them, it is composed of each of their unique structures.
I hope this is a good explanation - I'm sure it's one that could use some help/fixing as my understanding of this concept is still growing as well.