检查对象并确定对象有什么属性是很容易的事情,只要试着去检索对象属性并验证取得的值即可。同时,使用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可以枚举需要的属性,从而不用担心可能反射到原型链中的属性,并且可以按正确的顺序取得它们的值。