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();