JavaScript可枚举的属性

 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      */

 

posted @ 2018-04-08 01:21  假装自己是小白  阅读(527)  评论(0编辑  收藏  举报