Backbone.js abstracts remote resources into models and collections that emit events on state changes. This allows views to bind and respond to those changes. It provides concepts like models, collections, views and controllers to deal with common problems in web development like organizing rendering of views, supporting navigation, and avoiding callback soup. By abstracting functionality, separating concerns, and decoupling code, Backbone follows best practices and theoretical definitions of frameworks.