3、是实时的,这就意味着所有的对象自动可以访问新的方法。为了避免枚举man的时候出现clone()方法,你需要应用hasOwnProperty()方法过滤原型属性。如果不做过滤,会导致clone()函数显示出来,在大多数情况下这是不希望出现的。01//1.02//for-in循环03for (var i in man){04 if (man.hasOwnProperty(i)){ //过滤05 console.log(i, ":",man[i]);06 }07}08/*控制台显示结果09h
4、ands:210legs:211heads:112*/13 14//2.15//反面例子:16//for-inloopwithoutcheckinghasOwnProperty()17for (var i in man){18 console.log(i, ":",man[i]);19}20/*21控制台显示结果22hands:223legs:224heads:125clone:function()26*/另外一种使用hasOwnProperty()的形式是取消Object.prototype上的方
5、法。像这样:1for (var i in man){2 if (Object.prototype.hasOwnProperty.call(man,i)){ //过滤3 console.log(i, ":",man[i]);4 }5}其好处在于在man对象重新定义hasOwnProperty情况下避免命名冲突。也避免了长属性查找对象的所有方法,你可以使用局部变量“缓存”它。1var i,hasOwn=Object.prototype.hasOwnProperty;2for (i in m
6、an){3 if (hasOwn.call(man,i)){ //过滤4 console.log(i, ":",man[i]);5 }6}严格来说,不使用hasOwnProperty()并不是一个错误。根据任务以及你对代码的自信程度,你可以跳过它以提高些许的循环速度。但是当你对当前对象内容(和其原型链)不确定的时候,添加hasOwnProperty()更加保险些。格式化的变化(通不过JSLint)会直接忽略掉花括号,把if语句放到同一行上。其优点在于循环语句读起来就像一个完整的
7、想法(每个元素都有一个自己的属性”X”,使用”X”干点什么):1//警告:通不过JSLint检测2var i,hasOwn=Object.prototype.hasOwnProperty;3for (i in man) if (hasOwn.call(man,i)){ //过滤4 console.log(i, ":",man[i]);5}