先上范例:
// Poisoning Object.prototype Object.prototype.bar = 1; var foo = {moo: 2}; for(var i in foo) { console.log(i); // prints both bar and moo }
这里我们要注意两点,一是 for in 循环会忽略 enumerable 设置为 false 的属性。例如一个数组的 length 属性。第二是,由于 for in 会遍历整个原型链,所以当原型链过长时,会对性能造成影响。
enumerable 是个很陌生的词汇,实际上,你很难在 javascript 中发现它的影子,而它实际上也是作者从 ruby 中借鉴而来的。创建 enumerable 的目的不是为了独立使用,而是采用“混用”的方式,而 Prototype 中很多方法都混用了 enumerable,所以它可以说是 prototype 的奠基石。这里不做详细介绍,详细内容可以参考 - Enumerable。
由于我们没法改变 for in 循环本身的行为,所以我们只能采取其他方法来过滤掉那些不希望出现在循环内的属性,通过 《Javascript学习笔记之对象篇(三) : hasOwnProperty》 我们知道 hasOwnProperty 方法是可以做到这一点的。
使用 hasOwnProperty 过滤
仍然使用上个例子:
// Poisoning Object.prototype Object.prototype.bar = 1; var foo = {moo: 2}; for(var i in foo) { if (foo.hasOwnProperty(i)) { console.log(i); } }
这是唯一正确的写法,由于我们实用了 hasOwnProperty 方法,所以这次只输出 moo。如果不适用 hasOwnProperty 方法,那么当 Object.prototype 扩展时,就会出现错误。
现在很多框架都会选择从 Object.prototype 扩展方法,所以我们使用这些框架时,如果使用没有用 hasOwnProperty 过滤的 for in 循环时就会遇到问题。
总结
建议养成 hasOwnProperty 过滤属性的好习惯,不要对运行环境做任何假设,也无论原生的原型对象是否被扩展。
本文向大家介绍Javascript学习笔记之函数篇(四):arguments 对象,包括了Javascript学习笔记之函数篇(四):arguments 对象的使用技巧和注意事项,需要的朋友参考一下 每一个 Javascript 函数都能在自己作用域内访问一个特殊的变量 - arguments。这个变量含有一个传递给函数的所有参数的列表。 arguments 对象不是一个数组。尽管在语法上它跟数组
本文向大家介绍JavaScript学习笔记之JS对象,包括了JavaScript学习笔记之JS对象的使用技巧和注意事项,需要的朋友参考一下 默认对象 日期对象Date, 格式:日期对象名称=new Date([日期参数]) 日期参数: 1.省略(最常用); 2.英文-数值格式:月 日,公元年 [时:分:秒] 如:today=new Date("October 1,2008
本文向大家介绍JavaScript学习笔记之Cookie对象,包括了JavaScript学习笔记之Cookie对象的使用技巧和注意事项,需要的朋友参考一下 JavaScript Cookie Cookie对象: Cookie是一种以文件的形式保存在客户端硬盘的Cookies文件夹中的用户数据信息(Cookie数据)。 Cookie文件由所访问的Web站点建立,以长久的保存客户端与Web
本文向大家介绍JavaScript学习笔记之创建对象,包括了JavaScript学习笔记之创建对象的使用技巧和注意事项,需要的朋友参考一下 JavaScript 有Date、Array、String等这样的内置对象,功能强大使用简单,人见人爱,但在处理一些复杂的逻辑的时候,内置对象就很无力了,往往需要开发者自定义对象。 从JavaScript定义上讲对象是无序属性的集合,其属性可以包含基本值、对象
本文向大家介绍Javascript Object 对象学习笔记,包括了Javascript Object 对象学习笔记的使用技巧和注意事项,需要的朋友参考一下 构造函数 new Object() new Object(value) 参数 value 可选的参数,声明了要转换成Number对象、Boolean对象或String对象的原始值(即数字、布尔值或字符串)。JavaScript 1.
本文向大家介绍php学习笔记之面向对象,包括了php学习笔记之面向对象的使用技巧和注意事项,需要的朋友参考一下 public 公有的:本类,子类,外部对象都可以调用 protected 受保护的:本类 子类,可以执行,外部对象不可以调用 private 私有的:只能本类执行,子类与外部对象都不可调用 面向对象编程的三大特点 1)封闭性 封闭性,也可以称为信息隐藏。就是将一个类的使用和实现分开,