Ext原码学习之lang-Object.js
// 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); }; }());