Я немного возился с шаблонами прототипа и замыкания в Javascript. Как вы, возможно, знаете, существует снижение производительности при использовании шаблона замыкания, поскольку он переопределяет те же функции для каждый экземпляр объекта. Однако шаблон замыкания позволяет использовать частные переменные, что упрощает инкапсуляцию.
Вот типичный пример шаблона прототипа:
function Foo(val) {
this.val = val;
}
Foo.prototype.getVal = function() {
return this.val;
}
var f = new Foo(42);
Я думал, почему ты не можешь сделать что-то подобное?
function Parent() {
}
Parent.prototype.getVal = function() {
return this.val;
}
function foo(val) {
function Obj {
this.val = val;
}
Obj.prototype = new Parent();
return new Obj();
}
var f = foo(42); // Note the missing 'new'
Это позволяет использовать приватные переменные в функции foo(), и вы даже можете динамически устанавливать прототип в функции foo().
Я сделал тест jsperf.com, который действительно показывает большую разницу в производительности. , но я не знаю почему.