Что такое шаблон дизайна, известный как JavaScript/jQuery?

Я просматривал исходный код JavaScript для SlickGrid.

Я заметил, что slick.grid.js имеет следующую структуру:

(function($) {
    // Slick.Grid
    $.extend(true, window, {
        Slick: {
            Grid: SlickGrid
        }
    });

    var scrollbarDimensions; // shared across all grids on this page

    ////////////////////////////////////////////////////////////////////////////
    // SlickGrid class implementation (available as Slick.Grid)

    /**
     * @param {Node}           container   Container node to create the grid in.
     * @param {Array,Object}   data        An array of objects for databinding.
     * @param {Array}          columns     An array of column definitions.
     * @param {Object}         options     Grid options.
     **/
    function SlickGrid(container,data,columns,options) {
        /// <summary>
        /// Create and manage virtual grid in the specified $container,
        /// connecting it to the specified data source. Data is presented
        /// as a grid with the specified columns and data.length rows.
        /// Options alter behaviour of the grid.
        /// </summary>

        // settings
        var defaults = {
            ...
        };

        ...

        // private
        var $container;

        ...


        ////////////////////////////////////////////////////////////////////////
        // Initialization

        function init() {
            /// <summary>
            /// Initialize 'this' (self) instance of a SlickGrid.
            /// This function is called by the constructor.
            /// </summary>

            $container = $(container);

            ...
        }

        ////////////////////////////////////////////////////////////////////////
        // Private & Public Functions, Getters/Setters, Interactivity, etc.
        function measureScrollbar() {
            ...
        }

        ////////////////////////////////////////////////////////////////////////
        // Public API

        $.extend(this, {
            "slickGridVersion": "2.0a1",

            // Events
            "onScroll":                     new Slick.Event(),

            ...

            // Methods
            "registerPlugin":               registerPlugin,

            ...

        });

        init();
    }
}(jQuery));

Некоторые коды были опущены для краткости и ясности, но это должно дать вам общую идею.

  • Какова цель следующего: (function($) { // code }(jQuery)); Является ли это образцом модуля, о котором я говорил? Это означает, что глобальное пространство имен будет чистым?

  • Что означают строки $.extend(): Верхний $.extend(true, window, { // code }); выглядит так, как будто он имеет отношение к "пространству имен"; какое пространство имен? Похоже, что нижняя $.extend(this, { // code }); используется для выставления "публичных" членов и функций? Как бы вы определили частную функцию или переменную?

  • Как бы вы инициализировали несколько "SlickGrids", если хотите? Сколько они будут делиться и как они будут взаимодействовать? Обратите внимание на функцию "конструктор": function SlickGrid(...) { // code }.

  • Каковы некоторые книги, ссылки и другие ресурсы по кодированию в этом стиле? Кто его придумал?

Спасибо! ♥

Ответ 1

Это плагин jQuery.

(function($) { // code }(jQuery)); дает вам новую область функций, чтобы ваши имена не были сброшены в глобальную область. Передача jQuery как $позволяет использовать $shorthand, даже если другие библиотеки Javascript используют $.

$.extend - это метод jQuery для копирования свойств из одного объекта в другой. Первый аргумент true означает, что он должен быть глубоким, а не мелким экземпляром. Расширяя window, в этом случае создаются новые глобальные свойства Slick.

$.extend(this,...) внизу находится в заглавной функции SlickGrid. SlickGrid предназначен для использования в качестве конструктора, и в этом случае this будет вновь созданным объектом, поэтому этот extend добавляет свойства к объекту. Они являются фактически общественными членами. В этом примере кода measureScrollbar является закрытым: он доступен только для кода, определенного в этой функции, а не вне его.

Вы можете создать ряд сеток с помощью:

var grid1 = new Slick.Grid(blah, blah);
var grid2 = new Slick.Grid(blah, blah);

В коде, который вы указали, единственное, что разделили эти два экземпляра, это переменная scrollBarDimensions.

Ответ 2

(function($) { // code }(jQuery))

Это закрытие. Он в основном держит все внутри "кода" безопасным от вещей вне его. Вы передаете jQuery и $, но кто-то с большим количеством знаний должен будет объяснить, почему это необходимо.

$.extend()

Это функция jQuery, которая будет принимать два объекта и объединить их вместе. Замена первого объекта "окно" на второй объект {Slick: {Grid: SlickGrid}}. Это означает, что если есть объект Window с Grid: Null, теперь он будет равен Grid: SlickGrid.

Добавление true в качестве первого параметра означает, что он также заменит вложенные объекты:

var firstObj = { myObj:{
    first:this,
    second: {
        new: obj
    }
}}

$.extend(true, firstObj, {myObj:{second:{new:newer}}});

Это полезно, если вы используете множество объектов для хранения информации.

Не уверен, что вы подразумеваете под № 3, но посмотрите на http://960.gs для хорошей сетки.

JavaScript Хорошие детали - отличная книга. Pro JavaScript от Джона Ресига также является хорошей книгой, которая поможет вам выйти за рамки основ.

Ответ 3

Проще говоря, парень в вашем примере просто написал jQuery-подключаемый модуль... Проверьте раздел PLUGINS на jquery.com для получения дополнительных ссылок на источники о том, как закодировать плагины. Они просты, понятны и интересны для изучения.

Ответ 4

1) Эта функция вызывается немедленно при загрузке JS файла. Он получает экземпляр jquery как параметр и делает его доступным внутренне как "$". Весь код инкапсулирован в эту функцию, поэтому (если вы не забудете var впереди еще не объявленной переменной), ничто не загрязняет глобальное пространство имен.

2) Все свойства 2-го объекта копируются в 1-й объект, здесь "окно", которое также является объектом глобального пространства имен в веб-браузере. Поэтому этот код не имеет большого смысла. Он претендует на инкапсуляцию, но делает обратное. И второй вызов $.extend не имеет столь большого смысла. Это не так, я просто думаю, что код "притворяется".

4) Я очень сильно рекомендую вам посмотреть видео от Дугласа Крокфорда по адресу http://developer.yahoo.com/yui/theater/ Крокфорд - бог JS, очень известный (среди серьезных программистов JS) - и, кроме того, большое удовольствие слушать:)

Ответ 5

Для первого вопроса эта конструкция является способом, позволяющим jQuery сосуществовать с другими библиотеками, которые могут использовать функцию $, но все равно использовать $для ссылки на jQuery в кодовом блоке.

Весь пакет завернут в вызов функции с $ в качестве параметра. Единственное "основное" действие при его запуске - это вызов этой функции с помощью jQuery в качестве аргумента, что дает ссылку на общеизвестный глобальный jQuery на локальный параметр $, который маскирует любое глобальное значение, которое $ может иметь.