1 2 /* 3 把P中的可枚举属性复制到o中,并返回o中 4 如果o和p中含有同名的属性,则覆盖O中的属性 5 这个函数并不处理getter和setter以及复制属性 6 */ 7 function extend(o,p){ 8 for (prop in p){ //遍历p中的属性 9 o[prop] = p[prop]; //将属性添加至o中 10 } 11 return o; 12 } 13 14 /* 15 *将p中的可枚举属性复制o中,并返回o 16 如果o和p中有同名的属性,o中的属性将不受影响 17 这个函数并不处理getter和setter以及复制属性 18 */ 19 function merge(o,p){ 20 for(prop in p){ //遍历p中的所有属性 21 if (o.hasOwnProperty[prop]) continue;//过滤掉已经在o中存在的属性 22 o[prop] =p[prop]; //将属性添加至o中 23 } 24 return o; 25 } 26 /* 27 *如果o中的属性在P没有同名属性,则从o中删除这个属性 28 *返回o 29 */ 30 function restrict(o,p){ 31 for (prop in o){ //遍历o中的所有属性 32 if(!(prop in p)) delete o[prop]; //如果在p中不存在,则删除之 33 } 34 return o; 35 } 36 37 /* 38 *如果o中的属性在p中存在同名属性,则从o中删除这个属性 39 *返回o 40 */ 41 function subtract(o,p){ 42 for(prop in o){ //遍历p中的所有属性 43 delete o[prop]; //从o中删除(删除一个不存在的属性不会报错) 44 } 45 return o; 46 } 47 /* 48 *返回一个新对象,这个对象同时拥有o的属性和p的属性 49 *如果o和p中有重名对象,使用p中的属性值 50 */ 51 function union(o,p){ 52 return (extend(extend({},o),p);) 53 } 54 /* 55 返回一个新对象,这个对象拥有同时在o和p中出现的属性 56 很像求o和p的交集,但p中属性的值被忽略。 57 */ 58 function intersection(o,p){ return restrict(extend({},o),p); 59 60 } 61 /* 62 返回一个数组,这个数组包含的是o中可枚举的自有属性的名字 63 */ 64 function keys(o){ 65 if (typeof 0 !== "object") throw TypeError(); //参数必须是对象 66 var result = []; //将要返回的数组 67 for (var prop in o){ //遍历所有可枚举的属性 68 if(o.hasOwnProperty(prop)){ //判断是否是自有属性 69 result.push(prop); //将属性名添加至数组中 70 } 71 72 } 73 return result; //返回这个数组 74 } 75 76 /*ES5除了for/in 循环之外,定义了用以枚举属性名称的函数。 77 第一个是Object.keys(),返回一个数组。 78 第二个可枚举函数是Object.getOwnPropertyNames() 79 ES3中无法实现类似的函数,因为ES3中没有提供任何方法来获取对象的不可枚举属性 80 */