两种使用方式:
- for..in
- 返回所有能够通过对象访问的、可枚举的属性,其中包括实例属性,也包括原型属性。
- 通过obj.hasOwnProperty(xxx)可以判断某个属性是否是实例属性。
- Object.keys()传入一个对象作为参数,可以返回仅存在于该对象上的所有可枚举属性的字符串数组,不包括原型对象上的属性。
- Object.getOwnPropertyNames(),传入一个对象作为参数,可以返回所有存在于该实例对象上的属性名称,不论是否可枚举,但不包括原型对象上的属性。
ES5中,将constructor和prototype的enumerable设置为false.。
- 返回所有能够通过对象访问的、可枚举的属性,其中包括实例属性,也包括原型属性。
- 单独使用
- in操作符会在通过对象能够访问给定属性时返回true,无论该实例存在于实例中还是原型中。
- 区别:obj.hasOwnProperty(),只有在属性存在于实例中时才返回true,如果只存在于原型对象中,实例中没有,则会返回false。
- 结合in和obj.hasOwnProperty()可以找出只存在于原型对象上的属性:
return !obj.hasOwnProperty( name ) && ( name in obj );
,如果总体返回true,则obj.hasOwnProperty( name )返回也是true,则是实例上的属性,如果总体返回false,说明obj.hasOwnProperty( name )为false,如果此时name in obj为true,则可以确定这是只存在于原型对象上的属性。