Javascript - Сохранение функции в объекте - плохая практика?
Является ли практика плохого кодирования хранить функции в объекте, а не просто определять их (и, следовательно, глобально)?
Рассмотрим:
1.
Foo = {
bar: function() {
alert("baz");
}
}
Foo.bar();
против.
2.
function bar() {
alert("baz");
}
bar();
Конечно, это может быть немного меньше кода для второго примера, но когда вы начнете получать множество функций - это станет беспорядочным.
Я нахожу это, путь, более чистый, чтобы, например, использовать Game.update()
вместо использования updateGame(); или похожие. Когда вы становитесь глубже, например Game.notify.admin(id)
и т.д., Он дает вам еще более красивый код.
Есть ли недостатки, сохраняя функцию в объекте?
Ответы
Ответ 1
Первый подход является предпочтительным. Таким образом, вы явно определяете сферу своих функций, а не загрязняете глобальную область. Нет недостатков в использовании первого подхода. Только стороны: -)
Заключение: всегда используйте первый подход для определения функций. Второй вариант похож на javascript в 90-х, пусть он оставит его в покое в прошлом и использует правильную область обзора.
Ответ 2
В объектах пространства имен нет магии, и вы не будете иметь никаких проблем, если используете множество глобальных переменных.
Основная причина использования объектов "пространства имен" заключается в уменьшении потенциала для дублирования имен глобальных переменных. Вторая причина заключается в объединении подобных функций для удобства, например:
// Object example (suggested best practice):
// DOM functions are under myLib.dom
myLib.dom.someDOMFunction0;
myLib.dom.someDOMFunction1;
// Utility functions are under myLib.util
myLib.util.someUtilityFunction0;
myLib.util.someUtilityFunction1;
Обратите внимание, что вышеупомянутое имеет практически такую же вероятность дублирования, что и глобальные переменные:
// Global variable example:
myLib_dom_someDOMFunction0;
myLib_dom_someDOMFunction1;
myLib_util_someUtilityFunction0;
myLib_util_someUtilityFunction1;
Конечно, первый обычно предпочтительнее, потому что с ним легче работать. Я не утверждаю, что вы принимаете второй подход (я использую первый), просто указывая, что, хотя есть проблема с созданием множества глобальных переменных, так называемое "глобальное загрязнение пространства имен" сильно переоценивается как опасность.
Ответ 3
В этом конкретном случае переходим к первому. Но если объект Foo становится очень сложным, вы можете использовать другой подход, который даст вам возможность использовать конструктор. А также первый подход иногда не самый лучший, когда дело доходит до области функции:
function Foo(appName){
this.name = appName;
}
Foo.prototype.Bar = function(){
alert(this.name)
}
var a = new Foo("baz");
a.Bar();