首页 » 编写高质量代码:改善JavaScript程序的188个建议 » 编写高质量代码:改善JavaScript程序的188个建议全文在线阅读

《编写高质量代码:改善JavaScript程序的188个建议》建议84:防止原型反射

关灯直达底部

检查对象并确定对象有什么属性是很容易的事情,只要试着去检索对象属性并验证取得的值即可。同时,使用typeof操作符可以判断属性的类型。


typeof obj.number//'number'

typeof obj.status//'string'

typeof obj.name//'undefined'


但是,根据原型继承的关系,原型链中的所有属性也会产生反射,这种反射称为原型反射。


typeof obj.toString//'function'

typeof obj.constructor//'function'


为了避免原型继承的干扰,有两种方法可用于处理这些不需要的属性:

❑编写程序进行检查并剔除函数值。一般来说,对象反射的目标是读取对象包含的数据,因此当对象成员值为函数时,一般都不是我们需要的数据。

❑使用hasOwnProperty方法。如果对象拥有独有的属性,那么调用该方法将返回true,也就是说,hasOwnProperty方法不会检查原型链。


obj.hasOwnProperty('number')//true

obj.hasOwnProperty('constructor')//false


要快速枚举对象的所有属性,可以使用for in语句。该语句可遍历对象中的所有属性名,枚举过程将会列出所有的属性,包括方法和原型属性。因此,在枚举过程中,必须过滤掉那些不想要的值,具体方法如下:

❑使用hasOwnProperty方法过滤原型属性。

❑使用typeof运算符排除方法函数。

例如:


var name;

for(name in obj){

if(typeof obj[name]!=='function'){

document.writeln(name+':'+obj[name]);

}

}


当使用for in语句枚举对象时,由于属性名出现的顺序是不确定的,因此要对任何可能出现的顺序有所准备。要确保属性以特定的顺序出现,最好的办法就是避免使用for in语句,创建一个数组,在其中以正确的顺序包含属性名。


var i;

var properties=['one','two','three','four'];

for(i=0;i<properties.length;i+=1){

document.writeln(properties[i]+':'+obj[properties[i]]);

}


通过使用for而不是for in可以枚举需要的属性,从而不用担心可能反射到原型链中的属性,并且可以按正确的顺序取得它们的值。