Заметки в категории «JavaScript» (страница 10)

Возвращаясь к проверке типа данных

Об альтернативе typeof я уже писал в заметке «Проверка типа данных в JavaScript». А недавно на просторах интернета нашел ещё один аналогичный вариант такой функции.

var toType = function (obj) {
    return ({}).toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase();
}

Стоить только заметить, что он примерно в 2 раза медленнее, чем вариант со slice . Всё-таки регулярные выражения не спасает даже кеширование.

Оставте свой комментарий

Улучшенный namespace

Для определения модулей и констант приложения на JavaScript я люблю применять функцию аналогичную namespace из библиотеки YUI3 . Она возвращает объект, который соответствует указанному пути или создает новый, если таковой не нашелся. Ценность этой функции в том, что можно не заботиться о том, что какая-то многоуровневая вложенность будет испорчена. Так же она позволяет определять поля в любом порядке.

На практике типовое использование этой функции сводится к получению (или созданию) объекта и тут же заполнению его какими-то полями. Я решил объединить эти действия в один вызов. Так как в этом случае не требуется объявлять несколько модулей, то этот функционал был удален вообще.


(function (window, undefined) {

    var NS = "APP",
        app = window[NS] = window[NS] || {};

    /**
     * Get or create namespace for module
     * @param    ns        {String}    namespace
     * @param    origin    {Object}    initial object (optional)
     * @return             {Object}   
     */
    app.namespace = app["namespace"] || function (ns, origin) {
        var i, obj = window[NS], nsParts = ns.split('.');
        for (i = (nsParts[0] === NS) ? 1 : 0; i < nsParts.length; i++) {
            obj[nsParts[i]] = obj[nsParts[i]] || (i === nsParts.length - 1 && origin) || {};
            obj = obj[nsParts[i]];
        }
        return obj;
    };

}(window));

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

Её можно вызывать с одним строковым параметром

APP.namespace("APP.Module1");

или двумя параметрами — строковым и объектом, все поля которого будут перенесены в целевой namespace.

APP.namespace("APP.Module2", {
    method1: function () {
    },
    FIELD: "test"
});

Для названий можно использовать укороченный синтаксис и опускать базовое имя. Так вызовы APP.namespace("Module1") и APP.namespace("APP.Module1") будут эквивалентны.

Такую функцию удобно переносить из проекта в проект. Достаточно поменять только значение константы NS.

Оставте свой комментарий

Рецепт приготовления YUI 3 приложения

В блоге «Yahoo! User Interface» появилась большая статься о создании приложений под YUI3.

В ней очень подробно разобраны шаблон модуля, атрибуты конфигурации, статические методы класса и методы экземпляра. Так же описан процесс разработки виджетов и взаимодействие модуля с его окружением.

Оставте свой комментарий

Проверка типа данных в JavaScript


function is(type, obj) {
    var cls = Object.prototype.toString.call(obj).slice(8, -1);
    return obj !== undefined && obj !== null && cls === type;
}

Функция возвращает результат сравнения ожидаемого типа данных с реальным значением класса.

Аргумент type может принимать одно из значений String, Number, Boolean, Array, Object, Function, RegExp, Date, Error.

На основе этой базовой функции можно сделать целый набор специальных функций для проверки конкретного типа данных.


var TypeCheck = (function () {

    function is(type, obj) {
        var cls = Object.prototype.toString.call(obj).slice(8, -1);
        return obj !== undefined && obj !== null && cls === type;
    }

    var i, checkers = {},
        types = "String|Number|Boolean|Array|Object|Function|RegExp|Date|Error".split("|");

    for (i = types.length; i--;) {
        checkers["is" + types[i]] = (function (type) {
            return function (obj) {
                return is(type, obj);
            }
        })(types[i]);
    }

    return checkers;

})();

Оставте свой комментарий

Порядок элементов виджета Sortable

У виджета jQuery Sortable помимо метода serialize есть еще другой метод, который можно использовать для сохранения порядка сортировки элементов, — toArray. Его отличие заключается в том, что он возвращает массив id элементов, а не просто строку.


<ul id="search-engines">
  <li id="item-1">Яндекс</li>
  <li id="item-3">Bing </li>
  <li id="item-2">Google</li>
</ul>

Получаем массив

var engines = $("#search-engines").sortable("toArray");

В результате в переменной engines будет массив ["item-1", "item-3", "item-2"].

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

Комментарии к заметке: 2