遍历对象实例的属性和方法

前言

遍历对象实例的方法有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;
}
复制代码

转载于:https://juejin.im/post/5b65cecf518825311504954c

你可能感兴趣的:(遍历对象实例的属性和方法)