Object.keys()遍历出来的是可枚举的属性和for in一样,但是for in还可以循环构造函数都prototype中都属性。
1.for..in..
for (var props in p1) {
console.log('for-in:: '+props)
}
// 结果
// for-in:: work
// for-in:: eatting
// for-in:: name 该属性继承于Person.prototype
// for-in:: sayName 该属性继承于Person.prototype
// 从结果可以看出,for...in不但循环自己属性,还会循环构造函数都prototype中都属性。
// 如果实例属性是不可枚举的话,那for...in能循环出来吗?
// 我们把p1的work属性设为不可枚举
Object.defineProperty(p1, 'work', {
enumerable: false // 默认为true,表示可枚举
})
// 继续循环
for (var props in p1) {
console.log('for-in:: '+props)
}
// 结果
// for-in:: eatting
// for-in:: name 该属性继承于Person.prototype
// for-in:: sayName 该属性继承于Person.prototype
// 看吧,work没被循环出来,因为是不可枚举的。
// 如果想要循环p1实例自己的属性,则使用hasOwnProperty即可。
for (var props in p1) {
if (p1.hasOwnProperty(props)) {
console.log('for-in:: '+props)
}
}
// 结果
// for-in:: work
// for-in:: eatting
// 从结果可以看出,如果实例p1只想要循环自己的属性,则使用hasOwnProperty即可。
2.Obiect.keys()
console.log(Object.keys(p1))
// 结果:["work", "eatting"]
// 得到是一个可枚举属性数据,只循环实例p1自身属性,不循构造函数的prototype。
// 可见Object.keys()相当于for...in使用hasOwnProperty。
// 同样的,如果work是不可枚举的,那Object.keys()能循环出来吗?
// 我们把p1的work属性设为不可枚举
Object.defineProperty(p1, 'work', {
enumerable: false // 默认为true,表示可枚举
})
console.log(Object.keys(p1))
// 结果:["eatting"]
// 看吧,work没被循环出来,因为是不可枚举的。