The Principles of Object-Oriented JavaScript