Page 135 - 你不知道的JavaScript(上卷)
P. 135

绍一下:

                   var myObject = { };

                   Object.defineProperty(
                       myObject,
                       "a",
                       // 让 a 像普通属性一样可以枚举
                       { enumerable: true, value: 2 }
                   );

                   Object.defineProperty(
                       myObject,
                       "b",
                       // 让 b 不可枚举
                       { enumerable: false, value: 3 }
                   );

                   myObject.b; // 3
                   ("b" in myObject); // true
                   myObject.hasOwnProperty( "b" ); // true

                   // .......

                   for (var k in myObject) {
                       console.log( k, myObject[k] );
                   }
                   // "a" 2
               可以看到,myObject.b 确实存在并且有访问值,但是却不会出现在 for..in 循环中(尽管
               可以通过 in 操作符来判断是否存在)。原因是“可枚举”就相当于“可以出现在对象属性
               的遍历中”。


                          在数组上应用 for..in 循环有时会产生出人意料的结果,因为这种枚举不
                          仅会包含所有数值索引,还会包含所有可枚举属性。最好只在对象上应用
                          for..in 循环,如果要遍历数组就使用传统的 for 循环来遍历数值索引。




               也可以通过另一种方式来区分属性是否可枚举:

                   var myObject = { };

                   Object.defineProperty(
                       myObject,
                       "a",
                       // 让 a 像普通属性一样可以枚举
                       { enumerable: true, value: 2 }
                   );

                   Object.defineProperty(


               120   |   第 3 章
   130   131   132   133   134   135   136   137   138   139   140