Использование прототипа в замыкании - PullRequest
2 голосов
/ 03 июля 2011

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

1 Ответ

2 голосов
/ 03 июля 2011

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

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

...