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