Javascript-функция хранения в объекте-плохая практика?
считается ли плохой практикой кодирования хранить функции в объекте вместо того, чтобы просто определять их (и, следовательно, глобально)?
считаем:
1.
Foo = {
bar: function() {
alert("baz");
}
}
Foo.bar();
и
2.
function bar() {
alert("baz");
}
bar();
конечно, это может быть немного меньше кода для второго примера, но когда вы начинаете получать много функций - это будет грязно.
Я нахожу его способ, способ, чище, например, использовать Game.update()
вместо использования updateGame(); или подобные. Когда становится глубже, как Game.notify.admin(id)
и так далее, это дает вам еще красивее код.
есть ли недостатки при хранении функции в объекте?
3 ответа:
предпочтителен первый подход. Таким образом, вы явно определяете область своих функций, а не загрязняете глобальную область. Нет никаких недостатков использования первого подхода. Только плюсы : -)
вывод: всегда используйте первый подход для определения функций. Во-вторых, как javascript в 90-х годах, давайте оставим его в покое в прошлом и использовать правильное определение области.
нет никакой магии с объектами пространства имен, и вы не обязательно будете иметь какие-либо проблемы, если вы используете много глобальных переменных. Основная причина использования объектов "пространства имен" заключается в уменьшении возможности дублирования имен глобальных переменных. Вторая причина состоит в том, чтобы сгруппировать подобные функции вместе для удобства, например:
// 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;
конечно, первый обычно предпочтительнее, потому что с ним легче работать. Я не выступаю за то, чтобы вы приняли второй подход (я использую первый), просто указывая, что, хотя есть проблема с созданием большого количества глобальных переменных, так называемое "глобальное загрязнение пространства имен" сильно переоценено как опасность.
в этом конкретном случае идите с первым. Но если вы Foo объект становится действительно сложным, вы можете использовать другой подход, который даст вам возможность использовать конструктор. А также первый подход иногда не самый лучший, когда дело доходит до области действия функции:
function Foo(appName){ this.name = appName; } Foo.prototype.Bar = function(){ alert(this.name) } var a = new Foo("baz"); a.Bar();