一、for in 遍历会遇到的问题
- 问题:下面代码为什么只有自己定义的
c
被遍历出来,Object
其他的属性却没有被遍历出来?
js
var obj = {
a: 1,
b: 2
}
Object.prototype.c = function () {
console.log('c')
}
for (var key in obj) {
console.log(key); // a b c
}
题解:
- 解释这个现象,首先得了解下属性描述符。
- 属性描述符:任何一个对象,它的任何一个属性,都会对应一个属性描述符,可以用这么一段代码来得到某一个属性的描述符
Object.getOwnPropertyDescriptor('对象', '属性')
,返回描述符对象
js
Object.getOwnPropertyDescriptor(Object.prototype, 'c');
返回结果:
text
{
value: [Function (anonymous)],
writable: true, // 可以被修改
enumerable: true, // 可以被遍历
configurable: true
}
- 根据上面的打印结果,查看
toString
方法有什么不同
返回结果:
text
{
value: [Function: toString],
writable: true,
enumerable: false, // 不可以被遍历
configurable: true
}
结论:当enumerable
属性为false
这个对象属性不能被遍历。
- 改造上面的代码,使之属性
c
,不可遍历
js
Object.defineProperty(Object.prototype, 'c', {
value: function () {
console.log('c')
},
writable: true,
enumerable: false, // 不可以被遍历
configurable: true
})