Подтвердить что ты не робот

Имеет ли вложенная функция внутри памяти конструктора неэффективно?

Я наблюдал отличные видеоролики Crockford on JavaScript и дошел до того, что он утверждает, что с помощью оператора new и <some object>.prototype может ввести в заблуждение, поэтому он предлагает альтернативу (как показано здесь вокруг отметки 1:00:40):

function gizmo(id) {
    return {
        id: id,
        toString: function () {
            return "gizmo " + this.id;
        }
    };
}

function hoozit(id) {
    var that = gizmo(id);
    that.test = function (testid) {
        return testid === this.id;
    };
    return that;
}

Можно действительно утверждать, что это выглядит чище, и вы можете просто привести gizmo и hoozit просто вызвать gizmo() или hoozit() соответственно. Однако, исходя из того, что я понимаю, как работают вложенные функции, если в какой-то момент у меня было 1000 экземпляров hoozit, у меня было бы 1000 "копий" toString и 1000 "копий" test, а не только одного из каждый, если эти функции были добавлены в прототипы gizmo и hoozit соответственно.

Кажется необычным, что Crockford предоставит такой пример хорошей практики, поэтому мне было интересно, есть ли там что-то, чего я здесь не вижу (например, скрытая оптимизация JS), или это просто случай повышения качества кода за счет стоимости производительность?

Изменить:. Так как Мелпомен указал в комментариях, могут ли иметь значение эти закрытые функции или нет, рассмотрим следующий пример супер методов (то же видео, через пару секунд, слегка упрощенно):

function hoozit(id) {
    var that = gizmo(id);
    var super_toString = that.toString;
    that.test = function (testid) {
        return testid === this.id;
    };
    that.toString = function () {
        return super_toString.apply(that);
    };
    return that;
}

В этом случае внутренняя функция фактически закрывается над that и super_toString, поэтому я предполагаю, что она менее вероятно, что существует некоторая оптимизация.

4b9b3361