It’s not that hard to understand the reasons as to why that is. Overwhelmingly, the majority of Computer Science programs that are taught, are done so using languages that are based on classical inheritance models vs prototypal, that are also imperative/procedural instead of declarative/functional, and that furthermore are strongly-typed instead of loosely-typed languages:
https://msdn.microsoft.com/en-us/library/bb669144.aspx
When most developers first start using Javascript, they don’t (as you yourself pointed out) actually write javascript, but rather, some abstraction layer like jQuery, Knockout, Ember, Angular, even MooTools was a failed attempt to turn Javascript into something it was not (classical, procedural), simply because the authors thought it would make it “easier” to write JS. When in reality, they’ve done nothing more than to allow devs to continue to have misperceptions of the language, due to nothing more than buffering them from requiring the knowledge about how the language actually works and how it should actually be used.
Like I’ve said before… Javascript is “hard” to understand, not because of any perceived “short-comings” in the language itself, but rather because of the fact that, overwhelmingly, most developers will have to learn an entirely different approach to programming. Not because this approach is better or worse, but simply because it is different and has different application (i.e. hammer vs screwdriver). As Software engineers we know this to be true, that anytime we need to learn something new, effort and time actually have to be invested to make that happen. Why people think that learning a new language (especially one with such a different approach to programming in general) should be any different is beyond me.
Yes, it took a few years of experience and study before I actually “got it” when it comes to how to efficiently use and understand things like prototypal inheritance, functional programming, closure scoping, safe use of loose-typing, etc. And part of the reason why that was a few years instead of maybe 6 months or a year, is because 1) I was taught CS concepts that were based on impereetive/procedural/strongly-typed languages and 2) Instead of starting w/ basics JS, I also started w/ jQuery and moved on to other frameworks like BackboneJS and Angular w/o ever actually taking the time to dive deeper into JS itself to understand how these frameworks actually worked. But once I finally put in the time and effort to do so, it’s clearly been worth it. I see the benefits (and objectively, some of the pitfalls as well under certain use-cases) of these concepts now, not to mention, I have a much higher pay-check because of my knowledge and experience.