2010-12-28 2 views
7

Каковы текущие «правила большого пальца» для реализации JQuery пространств имен для размещения служебных функций общего назначения?Рекомендация по JQuery пространств имен + общее назначение функций полезности

У меня есть несколько методов утилиты JavaScript, разбросанных по различным файлам, которые я хотел бы объединить в одно (или более) пространства имен. Каков наилучший способ сделать это?

В настоящее время я смотрел на двух различных синтаксисов, перечисленных в порядке предпочтения:

//****************************** 
    // JQuery Namespace syntax #1 
    //****************************** 
    if (typeof(MyNamespace) === "undefined") 
    { 
    MyNamespace = {}; 
    } 

    MyNamespace.SayHello = function() 
    { 
    alert("Hello from MyNamespace!"); 
    } 

    MyNamespace.AddEmUp = function (a, b) 
    { 
    return a + b; 
    } 

    //****************************** 
    // JQuery Namespace syntax #2 
    //****************************** 
    if (typeof (MyNamespace2) === "undefined") 
    { 
    MyNamespace2 = 
    { 
     SayHello: function() 
     { 
      alert("Hello from MyNamespace2!"); 
     }, 

     AddEmUp: function (a, b) 
     { 
      return a + b; 
     } 
    }; 
    } 

Синтаксис # 1 более многословным, но кажется, что было бы легче поддерживать вниз по дороге. Мне не нужно добавлять запятые между методами, и я могу оставить все мои функции.

Есть ли другие, лучше способов сделать это?

+0

Я думаю, что синтаксис # 1 лучше, так как это позволяет использовать пространство имен в нескольких файлах. Я использую этот метод в своих проектах. –

+0

Я должен также расширить этот вопрос, включив пространства имен, содержащие перечисления. Для перечислений я бы предпочел синтаксис # 1. –

+0

NB: Размещение открытых фигурных скобок на их собственной линии - это приглашение к катастрофе. Открытые колючки всегда должны быть размещены на той же линии, что и их «владелец», т. Е. If(), = и т. Д. –

ответ

1

Для записи, я в конечном итоге, используя первый синтаксис:

$(function() 
{ 
    //******************************** 
    // PREDIKT NAMESPACE 
    //******************************** 

    if (typeof (Predikt) === "undefined") 
    { 
     Predikt = {}; 
    } 

    //******************************** 
    // PREDIKT.TIMER NAMESPACE 
    //******************************** 

    if (typeof (Predikt.Timer) === "undefined") 
    { 
     Predikt.Timer = {}; 
    } 

    Predikt.Timer.StartTimer = function() 
    { 
     return new Date().getTime(); 
    }; 

    Predikt.Timer.EndTimer = function() 
    { 
     return new Date().getTime(); 
    }; 

}); 
+1

Это ваш звонок, но 'Predikt = window.Predikt || {} 'отлично работает и короче. Пока вы ссылаетесь на новый объект как на свойство (например, window.Predict, а не только Predikt), вы не получите ReferenceError, а просто новый пустой объект. В любом случае вам не нужны парсеры вокруг имен объектов. – Ronny

3

Для плагинов jQuery и такого шаблона следует использовать $.fn.myPlugin, если вы хотите, чтобы он был доступен на элементах, и $.whatever, если вы просто хотите использовать пространство имен. Рекомендую прочитать официальное сообщение Plugins Authoring document и thesearticles.

Но JQuery в сторону, самый простой способ переместить ваши Utils бы вдоль этих линий:

var utils = window.utils || {}; 
utils.method = function(){}; 

Основы именования в JS не очень изменилась за последнее время - Вы должны проверить snook's article, DED's elegant approach и this SO question ,

Главное преимущество использования самозапускаемой функции для объявления пространств имен - вы можете выполнить материал в частном порядке перед возвратом объекта. Кроме того, объект будет готов для автозаполнения вашей консоли, который вы пропустите в пространстве имен $, потому что jQuery возвращает функцию, а не объект.

+0

предпочтительно 'var utils = window.utils || {} ' – Raynos

+0

Вы правы, пропустили это. Отредактировано, спасибо :-) – Ronny

+0

jQuery, вероятно, использовался здесь как синоним Javascript :) Во всяком случае, синтаксис jQuery плагина на самом деле не поддерживает пространство имен (кроме '' event.namespace'' в 'trigger' /' bind'); стандартное решение - довольно ужасное - похоже, использует одну функцию для почти всего. – Tgr

 Смежные вопросы

  • Нет связанных вопросов^_^