前言
遍歷對象實(shí)例的方法有3種,1.通過for in,2通過Object.keys方法,3.通過Object,getOwnPropertyNames
這三種方式默認(rèn)不可枚舉的所有屬性和方法,包括:hasOwnProperty()、propertyIsEnumerable()、toLocaleString()、toString()和valueOf()。ECMAScript5也將constructor和prototype屬性的[[Enumerable]]特性設(shè)置為false,但并不是所有瀏覽器都照此實(shí)現(xiàn)。
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))
示例
我們希望能輸出對象實(shí)例的所有屬性和原型的方法需要依靠Object.getOwnPropertyNames
function getOwnPropertyNames(obj){
return [...Object.getOwnPropertyNames(Object.getPrototypeOf(obj)),
...Object.getOwnPropertyNames(obj)];
}
console.log(getOwnPropertyNames(o1))
示例
另外
1.Object.hasOwnProperty只能用作判斷實(shí)例是否包含屬性和方法,而無法判斷原型是否包含,
2.in操作可以判斷實(shí)例和元素是否包含屬性和方法
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
從而可以定義一個(gè)判斷原型是否包含屬性和方法的方法
function hasPrototypeProperty(obj, name){
return !obj.hasOwnProperty(name) && name in obj;
}