Показать сообщение отдельно
  #7 (permalink)  
Старый 19.09.2014, 15:35
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

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

/**
     * @class Collection
     * @extends Array
     * @param {Array} arr
     * @constructor
     */
    var Collection = function (arr) {
        arr.forEach(function (elem) {
            this.push(elem);
        }, this);
    };
    (function (Collection, extend, methods) {
        Collection.prototype = extend;
        Collection.prototype.constructor = Collection;
        var collectionActionsList = ["remove", "click", "change", "hover", "on", "addClass", "removeClass", "toggleClass", "show", "hide"];
        for (var methodName in methods) {
            if (methods.hasOwnProperty(methodName)) {
                Collection.prototype[methodName] = methods[methodName];
            }
        }
        collectionActionsList.forEach(function (collectionMethodName) {
            this.prototype[collectionMethodName] = function () {
                return this._do(collectionMethodName, arguments);
            }
        }, Collection);
    })(Collection, [], {
        /**
         * @return {Lite}
         */
        last: function () {
            return this[this.length - 1];
        },
        /**
         * @return {Lite}
         */
        first: function () {
            return this[0];
        },
        /**
         * @param {String} method
         * @param {Array} [args]
         * @return {Collection}
         * @private
         */
        _do: function (method, args) {
            this.forEach(function ($elem) {
                $elem[method].apply($elem, args);
            });
            return this;
        },
        /**
         * @param mapHandler
         * @return {Collection}
         */
        map: function (mapHandler) {
            return new Collection(Array.prototype.map.call(this, mapHandler));
        },
        /**
         * @param filterHandler
         * @return {Collection}
         */
        filter: function (filterHandler) {
            return new Collection(Array.prototype.filter.call(this, filterHandler));
        }
    });
Ответить с цитированием