Javascript-функция хранения в объекте-плохая практика?


считается ли плохой практикой кодирования хранить функции в объекте вместо того, чтобы просто определять их (и, следовательно, глобально)?

считаем:

1.

Foo = {
    bar: function() {
        alert("baz");
    }   
}

Foo.bar();

и

2.

function bar() {
    alert("baz");
}

bar();

конечно, это может быть немного меньше кода для второго примера, но когда вы начинаете получать много функций - это будет грязно. Я нахожу его способ, способ, чище, например, использовать Game.update() вместо использования updateGame(); или подобные. Когда становится глубже, как Game.notify.admin(id) и так далее, это дает вам еще красивее код.

есть ли недостатки при хранении функции в объекте?

3 68

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