Ext原码学习之lang-Object.js
阅读原文时间:2023年07月09日阅读:1

// JavaScript Document
(function(){
var TemplateClass = function(){},

ExtObject = Ext.Object = {  
    chain:Object.create || function(object)  
    {  
        TemplateClass.prototype = object;  
        var result = new TemplateClass();  
        TemplateClass.prototype = null;

        return result;  
    },//Ext.log.info(ExtObject.chain({1:3}));  
    toQueryObjects:function(name,value,recursive)  
    {  
        var self = ExtObject.toQueryObject,objects = \[\],i,ln;  
        if(Ext.isArray(value))  
        {  
            for(i =0,ln = value.length;i<ln;i++)  
            {  
                if(recursive)  
                {  
                    objects = objects.concat(self(name+'\['+i +'\]', value\[i\],true));  
                }  
                else  
                {  
                    objects.push({  
                        name:name,  
                        value:value\[i\]  
                    });  
                }  
            }  
        }  
        else if(Ext.isObject(value))  
        {  
            for(i in value)  
            {  
                if(value.hasOwnProperty(i))  
                {  
                    if(recursive)  
                    {  
                        objects = objects.concat(self(name+'\['+i+'\]',values\[i\],true));  
                    }  
                    else  
                    {  
                        objects.push({  
                            name:name,  
                            value:value\[i\]  
                        });  
                    }  
                }  
            }  
        }  
        else  
        {  
            objects.push({  
                name:name,  
                value:value  
            });  
        }

        return objects;  
    },  
    toQueryString:function(object,recursive)  
    {  
        var paramObjects = \[\],params = \[\],i,j,ln,paramObject,value;

        for(i in object)  
        {  
            if(object.hasOwnProperty(i))  
            {  
                paramObjects = paramObjects.concat(ExtObject.toQueryObjects(i,object\[i\],recursive));  
            }  
        }

        for(j=0,ln=paramObjects.length;i<ln;j++)  
        {  
            paramObject = paramObjects\[j\];  
            value = paramObject.value;

            if(Ext.isEmpty(value))  
            {  
                value ='';  
            }  
            else if(Ext.isDate(value))  
            {  
                value = Ext.Date.toString(value);  
            }

            params.push(encodeURIComponent(paramObject.name) + '=' + encodeURIComponent(String(value)));  
        }

        return params.join('&');  
    },  
    fromQueryString:function(queryString,recursive)  
    {  
        var parts = queryString.replace(/^\\?/,'').split('&'),  
            object = {},  
            temp ,components,name,value,i,ln,part,j,subLn,matchedKeys,matchedName,  
            keys,key,nextKey;

        for(i=0,ln = parts.length;i<ln;i++)  
        {  
            part = parts\[i\];

            if(part.length>0)  
            {  
                components = part.split('=');  
                name = decodeURIComponent(components\[0\]);  
                value = (components\[1\] !==undefined ) ? decodeURIComponent(components\[1\]):'';  
                if(!recursive)  
                {  
                    if(object.hasOwnProperty(name))  
                    {  
                        if(!Ext.isArray(object\[name\]))  
                        {  
                            object\[name\] = \[object\[name\]\];  
                        }

                        object\[name\].push(value);  
                    }  
                    else  
                    {  
                        object\[name\] = value;  
                    }  
                }  
                else  
                {  
                    matchedKeys = name.match(/(\\\[):?(\[^\\\]\]\*)\\\]/g);  
                    matchedName = name.match(/^(\[^\\\[\]+)/);

                     if (!matchedName) {  
                        throw new Error('\[Ext.Object.fromQueryString\] Malformed query string given, failed parsing name from "' + part + '"');  
                    }

                    name = mathedName\[0\];  
                    keys = \[\];

                    if(matchedKeys === null)  
                    {  
                        object\[name\] = value;  
                        continue;  
                    }

                     for (j = 0, subLn = matchedKeys.length; j < subLn; j++) {  
                    key = matchedKeys\[j\];  
                    key = (key.length === 2) ? '' : key.substring(1, key.length - 1);  
                    keys.push(key);  
                }

                keys.unshift(name);

                temp = object;

                for (j = 0, subLn = keys.length; j < subLn; j++)  
                {  
                    key = keys\[j\];

                        if (j === subLn - 1) {  
                            if (Ext.isArray(temp) && key === '') {  
                                temp.push(value);  
                            }  
                            else {  
                                temp\[key\] = value;  
                            }  
                        }  
                        else {  
                            if (temp\[key\] === undefined || typeof temp\[key\] === 'string') {  
                                nextKey = keys\[j+1\];

                                temp\[key\] = (Ext.isNumeric(nextKey) || nextKey === '') ? \[\] : {};  
                            }

                            temp = temp\[key\];  
                        }  
                    }  
                }  
            }

        }  
        return object;  
    },  
    each:function(object,fn,scope)  
    {  
        for(var property in object)  
        {  
            if(object.hasOwnProperty(property))  
            {  
                if(fn.call(scope || object ,property,object\[property\],object)===false)  
                {  
                    return;  
                }  
            }  
        }  
    },  
    merge:function(destination)  
    {  
        var i =1,ln = arguments.length,  
        mergeFn = ExtObject.merge,  
        cloneFn = Ext.clone,  
        object,key,value,sourceKey;  
        for(;i<ln;i++)  
        {  
            object = arguments\[i\];

            for(key in object)  
            {  
                value = object\[key\];

                if(value && value.constructor === Object)  
                {  
                    sourceKey = destination\[key\];  
                    if(sourceKey && sourceKey.constructor===Object){  
                        mergeFn(sourceKey,value);  
                    }  
                    else  
                    {  
                        destination\[key\] = cloneFn(value);  
                    }  
                }  
                else  
                {  
                    destination\[key\]=value;  
                }  
            }  
        }  
    } ,  
    mergeIf: function(destination) {  
        var i = 1,  
            ln = arguments.length,  
            cloneFn = Ext.clone,  
            object, key, value;

        for (; i < ln; i++) {  
            object = arguments\[i\];

            for (key in object) {  
                if (!(key in destination)) {  
                    value = object\[key\];

                    if (value && value.constructor === Object) {  
                        destination\[key\] = cloneFn(value);  
                    }  
                    else {  
                        destination\[key\] = value;  
                    }  
                }  
            }  
        }

        return destination;  
    },  
    getKey:function(object,value)  
    {  
        for(var property in object)  
        {  
            if(object.hasOwnProperty(property) && object\[property\] === value)  
            {  
                return property;  
            }  
        }

        return null;  
    },  
    getValues:function(object){  
        var values = \[\],property;  
        for(property in object)  
        {  
            if(object.hasOwnProperty(property))  
            {  
                values.push(object\[property\]);  
            }  
        }

        return values;  
    },  
    //获取objects key  
    getKeys:(typeof Object.keys == 'function') ? function(object){  
        if(!object){  
            return \[\];  
        }  
        return Object.keys(object);  
    } :function(object){  
        var keys = \[\],property;

        for(property in object)  
        {  
            if(object.hasOwnProperty(property))  
            {  
                keys.push(property);  
            }  
        }  
        return keys;  
    },  
    //获取objects property count  
    getSize:function(object){  
        var size = 0,property;

        for(property in object)  
        {  
            if(object.hasOwnProperty(property))  
            {  
                size++;  
            }  
        }  
        return size;  
    },  
    //判断对象是否有属性  
    isEmpty:function(object)  
    {  
        for(var key in object)  
        {  
            if(object.hasOwnProperty(key))  
            {  
                return false;  
            }  
        }

        return true;  
    },  
    //判断对象是否相等  
    equals: (function() {  
        var check = function(o1, o2) {  
            var key;

            for (key in o1) {  
                if (o1.hasOwnProperty(key)) {  
                    if (o1\[key\] !== o2\[key\]) {  
                        return false;  
                    }  
                }  
            }  
            return true;  
        };

        return function(object1, object2) {

            // Short circuit if the same object is passed twice  
            if (object1 === object2) {  
                return true;  
            } if (object1 && object2) {  
                // Do the second check because we could have extra keys in  
                // object2 that don't exist in object1.  
                return check(object1, object2) && check(object2, object1);  
            } else if (!object1 && !object2) {  
                return object1 === object2;  
            } else {  
                return false;  
            }  
        };  
    })(),  
    classify:function(object)  
    {  
        var prototype = object,objectProperties = \[\],  
            propertyClassMap = {},  
            objectClass = function(){  
                var i = 0,ln = objectProperties.length,property;

                for(;i<ln;i++)  
                {  
                    property = objectPropertyes\[i\];  
                    this\[property\] = new propertyClassesMap\[property\]();  
                }  
            },key,value;

        for(key in object)  
        {  
            if(object.hasOwnProperty(key))  
            {  
                value = object\[key\];

                if(value && value.constructor === Object)  
                {  
                    objectProperties.push(key);  
                    propertyClassMap\[key\] = ExtObject.classify(value);  
                }  
            }  
        }    

        objectClass.property = property;

        return objectClass;  
    }

};

Ext.merge = Ext.Object.merge;

Ext.mergeIf = Ext.Object.mergeIf;

/\*\*  
 \*  
 \* @member Ext  
 \* @method urlEncode  
 \* @inheritdoc Ext.Object#toQueryString  
 \* @deprecated 4.0.0 Use {@link Ext.Object#toQueryString} instead  
 \*/  
Ext.urlEncode = function() {  
    var args = Ext.Array.from(arguments),  
        prefix = '';

    // Support for the old \`pre\` argument  
    if ((typeof args\[1\] === 'string')) {  
        prefix = args\[1\] + '&';  
        args\[1\] = false;  
    }

    return prefix + ExtObject.toQueryString.apply(ExtObject, args);  
};

/\*\*  
 \* Alias for {@link Ext.Object#fromQueryString}.  
 \*  
 \* @member Ext  
 \* @method urlDecode  
 \* @inheritdoc Ext.Object#fromQueryString  
 \* @deprecated 4.0.0 Use {@link Ext.Object#fromQueryString} instead  
 \*/  
Ext.urlDecode = function() {  
    return ExtObject.fromQueryString.apply(ExtObject, arguments);  
};

}());