I have used JavaScript of and on for many years but in the last three years I have used it seriously for building a large client-side web application. During that time I have push many of the boundaries of JavaScript and uncovered some fundamental issues with the language.
One of the most common complaints about JavaScript is that its object system is broken. This is almost always becuase of a misunderstanding of what the language is. JavaScript is not an object-oriented language, it is a prototype language. What does this mean? It means that I can change the “object hierarchy” of an existing object at runtime by changing the object’s prototype. This is by design and isn’t one of the real problems–it just requires a different way of thinking.