Вопрос, заданный в этом вопросе, не кажется мне правильным. Замыкания и наследование прототипов - это два разных аспекта языка, они не являются несовместимыми. JS - это язык ООП, основанный на прототипах, а не на классах. Закрытие - это способ сохранить область действия функции за пределами ее выполнения. Я не понимаю, почему они должны быть несовместимыми. Чтобы привести пример, я мог бы иметь что-то вроде этого:
function MyButton(tag) {
tag.addEventListener("click", this.onClick.bind(this), false);
}
MyButton.prototype = {
constructor: MyButton,
onClick : function(event){
this.doSomething();
},
doSomething : function() {
// do something
}
}
function MySpecialButton(tag) {
MyButton.call(this, tag);
}
MySpecialButton.prototype = Object.create(MyButton);
MySpecialButton.prototype.doSomething = function() {
// do something else
}
Обратите внимание, что с помощью bind
я создаю замыкание, более элегантно, где поддерживается ES5. Вы можете получить тот же результат, используя более явное замыкание, если хотите:
function MyButton(tag) {
var myself = this;
tag.addEventListener("click", function(event) { myself.onClick(event) }, false);
}
Вы используете наследование прототипа, чтобы наследовать и закрывать, чтобы сохранить объем, который вам нужен, когда вам это нужно.