Self was bad because prototype based languages are not intuitive. This is why we get the endless years of people trying to explain why it's good or how to use it and endless "discoveries" and "frameworks" to leverage "new" tricks. JS is a mess because it's prototype based, to start. Same reason Pony is more progressive than Erlang (Prolog syntax?).
JS is a mess because it's prototype based, to start.
It's internals are prototype based. The user-visible layer is essentially class-based, but lacks syntactic support for both inheritance and composition.