One of the advantages is that this can be defined and handled on the prototype level and not just in the instance. Personally, I'd see the interrupt-like catch-all behavior rather as an advantage (all messages are received in a single slot), but this may be up to personal taste. And, while it's true that similar binding can be achieved using closures, this has also been true for arrow functions. It's just a convenient solution in the mindset of the original ECMA Script (ECMA 262-2).
Regarding prototypes, mind how this shares methods between instances, rather than consuming (and locking) resources by individual closures created in each of the instances (which, when GC was still based on reference count, would also have meant memory leaks):
function Counter(buttonElement) {
this.clicked = 0;
buttonElement.addEventlistener("click", this, false);
}
Counter.prototype = {
reset: function() { this.clicked = 0; },
log: function() { concole.log("I was clicked " + this.clicked + " times."); },
handleEvent: function(event) { this.clicked++; this.log(); }
};