Что лучше иногда может быть определено контекстом их использования.
Три ограничения того, как я могу выбирать между Прототип и Закрытие методы кодирования (я активно использую оба):
- Производительность / ресурсы
- Требования к сжатию
- Управление проектами
1.Производительность / ресурсы
Для одного экземпляра объекта подойдет любой метод.Любые преимущества в скорости, скорее всего, были бы пренебрежимо малы.
Если я создаю 100 000 таких экземпляров, например, создаю библиотеку книг, тогда Метод прототипа будет предпочтительнее.Все. Прототип.функции будут создаваться только один раз, вместо того, чтобы эти функции создавались 100 000 раз при использовании Closure Method .Ресурсы не бесконечны.
2.Сжатие
Используйте метод закрытия , если важна эффективность сжатия (например, большинство библиотек / модулей браузера).См. Объяснение ниже:
Сжатие - метод прототипа
function Book(title) {
this.title = title;
}
Book.prototype.getTitle = function () {
return this.title;
};
Сжимается ли YUI до
function Book(a){this.title=a}Book.prototype.getTitle=function(){return this.title};
Экономия около 18% (все пробелы / табуляции / возвраты).Этот метод требует отображения переменных / функций (this.variable = value), чтобы каждая функция-прототип могла получить к ним доступ.Таким образом, эти переменные / функции нельзя оптимизировать при сжатии.
Сжатие - метод закрытия
function Book(title) {
var title = title; // use var instead of this.title to make this a local variable
this.getTitle = function () {
return title;
};
}
Сжимается ли YUI до
function Book(a){var a=a;this.getTitle=function(){return a}};
Экономия около 33%.Локальные переменные могут быть оптимизированы.В большом модуле с множеством вспомогательных функций это может значительно сэкономить на сжатии.
3.Управление проектами
В проекте с несколькими разработчиками, которые могут работать над одним модулем, я предпочитаю Метод прототипа для этого модуля, если он не ограничен производительностью или сжатием.
Для разработки браузеров я могу переопределить функцию producton.prototype.aFunction из «production.js» в моем собственном «test.js» (читается в послесловиях) для целей тестирования или разработки, без необходимости изменять"production.js", который может активно разрабатываться другим разработчиком.
Я не большой поклонник сложной проверки GIT-репозитория / ветки / слияния / конфликта потока.Я предпочитаю простой.
Кроме того, возможность переопределения или «перехвата» функции модуля с помощью тестового стенда может быть полезной, но слишком сложной для рассмотрения здесь ...