Использование шаблона прототипа в замыкании

Я немного возился с шаблонами прототипа и замыкания в 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, который действительно показывает большую разницу в производительности. , но я не знаю почему.


person Husky    schedule 02.07.2011    source источник


Ответы (1)


Разница в производительности, скорее всего, связана с тем, что вы создаете два объекта вместо одного. Вы создаете один дополнительный объект только для того, чтобы использовать его в качестве прототипа для другого.

Если вы хотите создать множество подобных объектов, вам следует просто создать один объект-прототип и использовать его в качестве прототипа для всех объектов, которые вы создаете.

person Guffa    schedule 02.07.2011