前言
遍历对象实例的方法有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')) // trueconsole.log(o1.hasOwnProperty('sayName')) // falseconsole.log('name' in o1) //trueconsole.log('sayName' in o1) //true复制代码
从而可以定义一个判断原型是否包含属性和方法的方法
function hasPrototypeProperty(obj, name){ return !obj.hasOwnProperty(name) && name in obj;}复制代码