OOP, static types and visibility are different concepts. OOP does not require the other two.
1) JavaScript is based on single inheritance.
You say that because you cannot write
class C extends A, B { }
JS is not a proper OOP language.
Are you implying that each single inheritance language (like Java) is not a proper OOP language?
2) Mixins
Mixins are not related to inheritance. They attach function to objects. In fact they do not have a constructor nor the possibility to call a method of the other class using super.
3) Interfaces
Interfaces and typescript are about static typing. JS does not have such feature.
OOP doesn't require static types. Besides the dynamicity of JS makes it very powerful.
4) Abstract classes.
Yes, you cannot have an abstract class, but with the idea of preferring composition over inheritance, abstract classes are often the wrong solution.
5) Static polymorphism
That is a very misleading definition of overloading since it does not use any kind of polymorphism. (Well if you walk the dark path of S.F.I.N.A.E. it can be considered polymorphism…)
When you write:
draw(Circle c);
draw(Rectangle r);
the compiler reads
drawCircle(c);
drawRectangle(r);
They are just 2 different methods, and in JS you use the extended version (drawCirle) instead of of the short version( draw(Circle c)). That’s because there is no static types feature.
A similar concept is valid for overloading based on different numbers of parameters.
On the other hand writing logic inside the method to decide which version of the method has been called is a kind of override, not overload.
6) Protected properties and methods
This is about visibility not OOP per se. In JS everything accessible is public. Private/protected features are an old concept. Deciding that a method cannot be accessed while writing a class can be considered wrong. What you want to tell to the users is that a “private” method was not designed to be used outside its context (class instance). Blocking the access to the method is a complete different thing and could be considered wrong.
In fact in JS we often use the _method() syntax to tell users that the method is not intended to be of public use.
That said, the old way of protected and private stuff is useful and I use it in Typescript.
Conclusion
May be it is time to stop asking “How do I port Java/C# features in JS”, and start asking “How do I implement this in JavaScript”.
Finally, JS supports functional programming… may be instead of using OOP all the time we can start using functional programming and use a fewer (or no) classes.