前言
遍历对象实例的方法有3种,1.通过for in,2通过Object.keys方法,3.通过Object,getOwnPropertyNames
这三种方式默认不可枚举的所有属性和方法,包括:hasOwnProperty()、propertyIsEnumerable()、toLocaleString()、toString()和valueOf()。ECMAScript5也将constructor和prototype属性的[[Enumerable]]特性设置为false,但并不是所有浏览器都照此实现。
class Person {
constructor(){
this.name = ""
this.age = 0
}
sayName(){
console.log('sayName')
}
}
var o1 = new Person()
/*
3种写法,都输出name,age没有输出sayName,constructor
*/
//第1种方式
for(var prop in o1){
console.log(prop)
}
//第2种方式
console.log(Object.keys(o1))
//第3种方式
console.log(Object.getOwnPropertyNames(o1))
示例
我们希望能输出对象实例的所有属性和原型的方法需要依靠Object.getOwnPropertyNames
function getOwnPropertyNames(obj){
return [...Object.getOwnPropertyNames(Object.getPrototypeOf(obj)),
...Object.getOwnPropertyNames(obj)];
}
console.log(getOwnPropertyNames(o1))
示例
另外
1.Object.hasOwnProperty只能用作判断实例是否包含属性和方法,而无法判断原型是否包含,
2.in操作可以判断实例和元素是否包含属性和方法
var o1 = new Person()
console.log(o1.hasOwnProperty('name')) // true
console.log(o1.hasOwnProperty('sayName')) // false
console.log('name' in o1) //true
console.log('sayName' in o1) //true
从而可以定义一个判断原型是否包含属性和方法的方法
function hasPrototypeProperty(obj, name){
return !obj.hasOwnProperty(name) && name in obj;
}