zoukankan      html  css  js  c++  java
  • 《JS权威指南学习总结--6.5枚举属性》

    内容要点:

    一.for/in循环

       1.for/in循环可以在循环体中遍历对象中所有可枚举的属性(包括自有属性和继承的属性),把属性名称赋值给循环变量。对象继承的内置方法不可枚举,但在代码中给对象添加的属性都是可枚举的(除非用到下文中提到的一个方法将它们转化为不可枚举的)。例如:

       var o = {x:1, y:2,z:3} //三个可枚举的属性

       o.propertyIsEnumberable("toString"); // =>false,不可枚举

       for(p in o) //遍历属性

       console.log(p); //输出x,y和z,不会输出toString

      2.在ES 5之前,一些新添加的方法是不能定义为不可枚举的,因此它们都可以在for/in循环中枚举出来。为了避免这种情况,需要过滤for/in循环返回的属性,下面这两种方式是最常见的:

          for( p in o){

          if(!o.hasOwnproperty(p)) continue; //跳过继承的属性

        }

          for(p in o){

           if(typeof o[p]==="function") continue; //跳过方法

           }

    二.一些有用的工具函数来操控对象的属性,这些函数用到了for/in循环。

         用来枚举属性的对象工具函数:

         /*把p中的可枚举属性复制到o中,并返回o。 如果o和p中含有同名属性,则覆盖o中的属性。  这个函数并不处理getter和setter以及复制属性*/

         function extend(o,p){

             for( prop in p ){             //遍历p中的所有属性

                o[prop]=p[prop];        //将属性添加至p

                 }

                return o;

         }

      

         /*将p中的可枚举属性复制至o中,并返回o。如果o和p中有同名的属性,o中的属性将不受影响。这个函数并不出来getter和setter以及复制属性*/

          funtion merge(o,p){

            for(prop in p){                                         //遍历p中的所有属性

                 if(o.hasOwnproperty[prop]) continue;   //过滤掉已经在o中存在的属性

                 o[prop]=p[prop];                               //将属性添加至o中

                }

                return o;

          }

       

         /*如果o中的属性在p中没有同名属性,则从o中删除这个属性,返回o*/

         function restrict(o,p){

             for(prop in p){                            //遍历o中的所有属性

               if(!(prop in p)) delete o[prop];   //如果在p中不存在,则删除之

             }

              return o;

             }

       

          /*如果o中的属性在p中存在同名属性,则从o中删除这个属性,返回o*/

         function substract(o,p){

               for(prop in p){            //遍历p中的所有属性

                   delete o[prop]         //从o中删除(删除一个不存在的属性不会报错)

                }  

               return o;

            }

         /*返回一个新对象,这个对象同时拥有o的属性和p的属性,如果o和p中有重名属性,使用p中的属性值*/

             function union(o,p){ return extend( extend({},o),p ); }

         /*返回一个新对象,这个对象拥有同时在o和p中出现的属性,很像求o和p的交集,但p中属性的值被忽略*/

            function intersection(o,p){return restrict(extend({},o),p);}

         /*返回一个数组,这个数组包含的是o中可枚举的自有属性的名字*/

           function keys(o){

              if(typeof o !== "object") throw TypeError();   //参数必须是对象

              var result = [];                                            //将要返回的数组

              for( var prop in o){                                      //遍历所有的可枚举的属性

                   if(o.hasOwnProperty(prop))                     //判断是否是自有属性

                         result.push(prop);                            //将属性名添加至数组中

               }

               return result;                                              //返回这个数组

             } 

    三.

       除了for/in循环之外,ES 5定义了两个用以枚举属性名称的函数。第一个是Object.keys(),它返回一个数组,这个数组由对象中可枚举的自有属性名称组成。

       ES 5中第二个枚举属性的函数是Object.getOwnPropertyNames(),它和Object.keys()类似,只是它返回对象的所有的自有属性的名称,而不仅仅是可枚举的属性。

         

  • 相关阅读:
    poj- 2528 Mayor's posters
    POJ 2631 Roads in the North (树的直径裸题)
    Quoit Design (白话--分治--平面点对问题)
    洛古 P1020 导弹拦截 (贪心+二分)
    D
    代理模式---动态代理之Cglib
    代理模式---动态代理之JDK
    开闭原则
    迪米特法则
    接口隔离原则
  • 原文地址:https://www.cnblogs.com/hanxuming/p/5793260.html
Copyright © 2011-2022 走看看