- 01
 - 02
 - 03
 - 04
 - 05
 - 06
 - 07
 - 08
 - 09
 - 10
 - 11
 - 12
 - 13
 - 14
 - 15
 - 16
 - 17
 - 18
 - 19
 - 20
 - 21
 - 22
 - 23
 - 24
 - 25
 - 26
 - 27
 - 28
 - 29
 - 30
 - 31
 - 32
 - 33
 - 34
 - 35
 - 36
 - 37
 - 38
 - 39
 - 40
 - 41
 - 42
 - 43
 - 44
 - 45
 - 46
 - 47
 - 48
 - 49
 - 50
 - 51
 - 52
 - 53
 - 54
 - 55
 - 56
 - 57
 - 58
 - 59
 - 60
 - 61
 - 62
 - 63
 - 64
 - 65
 - 66
 
                        (function(G, U) {
    "use strict";
    var $ = G.jQuery,
        string = "string",
        number = "number",
        bool   = "boolean",
        object = "object";
    function hasStr(obj, prop) {
        return obj.hasOwnProperty(prop) && typeof obj[prop] === string;
    }
    function hasNum(obj, prop) {
        return obj.hasOwnProperty(prop) && typeof obj[prop] === number;
    }
    function hasArr(obj, prop) {
        return obj.hasOwnProperty(prop) && $.isArray(obj[prop]);
    }
    function hasFn(obj, prop) {
        return obj.hasOwnProperty(prop) && $.isFunction(obj[prop]);
    }
    function hasBool(obj, prop) {
        return obj.hasOwnProperty(prop) && typeof obj[prop] === bool;
    }
    function copyProps(source, target, fields) {
        var i,
            count,
            fieldType,
            fieldTypes = {
                str : hasStr,
                bool: hasBool,
                arr : hasArr,
                fn  : hasFn,
                num : hasNum
            };
            
        if (arguments.length < 2){
            return;
        }
        
        if (arguments.length === 2){
            target = {};
        }
        if ($.isPlainObject(source) && $.isPlainObject(target) && $.isPlainObject(fields)) {
            for (fieldType in fieldTypes) {
                if (fieldTypes.hasOwnProperty(fieldType)) {
                    if (hasArr(fields, fieldType)) {
                        for (i = 0, count = fields[fieldType].length; i < count; i += 1) {
                            if (fieldTypes[fieldType](source, fields[fieldType][i])) {
                                target[fields[fieldType][i]] = source[fields[fieldType][i]];
                            }
                        }
                    }
                }
            }
        }
        return target;
    }
    G.copyProps = copyProps; //Export into global namespace
}(this, undefined));
                                 
        
            Здравствуйте! Написал функцию, которая безопасно копирует свойства из одного объекта в другой, выполняя проверку типа каждого копируемого поля. Скажите, какие недостатки и насколько оправдано её применение по сравнению со стандартной функцией jQuery extend()? Работает только с простыми объектами, для вложенных объектов нужно ещё раз вызывать эту функцию.
        
        
2. Требует передавать структуру копируемого объекта, рассортированную по типам - no user friendly api.
3. Зависит от jQuery - так зачем нужен этот велосипед?
Рекурсивный обход с проверкой типов пишется гораздо проще чем тут. Почитайте сорцы jQuery, underscore.