Это хорошая структура для моих скриптов jQuery? - PullRequest
7 голосов
/ 23 сентября 2011

Я хочу, чтобы мои сценарии были организованы в один файл .js для всего моего сайта (у меня сейчас беспорядок), что-то вроде пространств имен и классов в C # ...

(function ($) {

    //private variables
    $.divref = $("#divReference");

    //Namespaces
    window.MySite = {};
    window.MySite.Home = {};
    window.MySite.Contact = {};

    //Public function / method
    window.MySite.Home.Init = function(params){
        alert("Init");

        MySite.Home.PrivateFunction();

        $.divref.click(function(){
            alert("click");
        });
    };

    //private function / method
    MySite.Home.PrivateFunction = function(){
        alert("Private");
    };

})(jQuery); 

Это идиоматическая раскладка в jQuery и JScript?

Ответы [ 3 ]

3 голосов
/ 23 сентября 2011

Я опубликую свой комментарий как ответ, хотя я не на 100% отвечаю на ваши вопросы о пространствах имен c # и их параллелях в JavaScript (я не программист на c #). Вы на самом деле не создаете приватные переменные, потому что присоединяете их к объекту $, который будет существовать после завершения этой функции. Если вам нужны закрытые переменные, вам нужно использовать замыкание. Те выглядят примерно так:

var myObject = function () {
  var innerVariable = 'some private value';

  return {
    getter: function () {
      return innerVariable;
    }
  }
}()

Если вы попытаетесь получить доступ к myObject.innerVariable, он вернет undefined, но если вы позвоните myObject.getter(), он вернет значение правильно. Это концепция, которую вы захотите прочитать в JavaScript, и для программирования в целом. Надеюсь, это поможет.

1 голос
/ 23 сентября 2011

Это больше, как я бы реализовал шаблон, который вы пытаетесь сделать:

// MySite.Home Extension
window.MySite = 
    (function ($, root) {

        //private variables
        var $divref = $("#divReference");

        //private function / method
        var privateFunction = function(){
            alert("Private");
        };        

        root.Home = {};

        // Public variable
        root.Home.prop = "Click"

        //Public function / method
        root.Home.Init = function(params){
            alert("Init");

            private();

            $divref.click(function(){
                alert(root.Home.prop);
            });
        };

        return root;

    })(jQuery, window.MySite || {} );   

// MySite.Contact Extension
window.MySite = 
    (function ($, root) {

        root.Contact = {};

        // More stuff for contact

        return root;

    })(jQuery, window.MySite || {} ); 

Первое изменение - это разбиение каждого "пространства имен" на собственный шаблон модуля, поэтому частные переменные не будут сливаться из пространства имен впространство имен (если вы намереваетесь, чтобы они были частными по отношению к пространству имен, что было бы более C # esque).Во-вторых, вместо доступа к window.MySite, передайте объект, который вы хотите расширить (в данном случае я называю его root).Это даст вам некоторую гибкость.

Ваши приватные методы не были действительно приватными.Чтобы создать приватный метод, вы просто хотите создать функцию var, которую он связал в замыкании, но не назначил свойству внешне видимого объекта.Наконец, вы, вероятно, не хотите использовать $.somegarbage.Как упоминалось в комментарии, вы добавляете свойство к объекту $, которое все еще будет там, когда будет выполнено закрытие.Если бы вы хотели что-то близкое, я бы просто использовал $somegarbage, что некоторые люди, кажется, хотели бы сделать, но любое имя переменной будет работать для частных переменных, до тех пор, пока переменная связана в области замыканий (не где-то еще)1013 *

Вы на правильном пути ...

0 голосов
/ 23 сентября 2011

Вы можете прочитать шаблон Module ( more ) и замыкания в javascript, чтобы предотвратить загрязнение глобального пространства имен.

...