文章目录
能否被for…in循环
判断一个属性是否可枚举的一个标准是看:对象的这个属性能否被for…in循环给遍历出来,例子:
1.基本包装类型如Object, Array, Number等的对象,直接遍历他们创建的实例对象,用for…in循环是遍历不出属性来的,因为这样遍历的是基本包装类型的实例对象的原型属性,而原型属性是不可被遍历的。
var num = new Number();
for(var pro in num) {
//代码没执行进来,因为没遍历出属性
console.log("num." + pro + " = " + num[pro]);
}
2.但是如果给基本类型的prototype添加属性方法,这些添加的属性是可遍历的
Number.prototype.xx = function(){
console.log('xx');
}
var num = new Number();
for(var pro in num) {
console.log("num." + pro + " = " + num[pro]);
}
//打印结果
// num.xx = function(){
// console.log('xx');
// }
另外注意,实例对象是无法直接在prototype添加属性的:
3.普通对象属性的可枚举性
var obj = {
a: 1,
b: 2
}
for(var pro in obj) { //普通对象的属性都能被枚举
console.log("num." + pro + " = " + obj[pro]);
}
输出结果:
对象的可枚举性除了会影响for…in还会影响Object.keys()和JSON.stringify方法
例1:class类的constructor属性和prototype属性都能够被遍历,但是Object.keys()只能遍历本身相关的属性,prototype的遍历不了
例2:普通对象的属性可以被遍历
但是普通对象不能够使用prototype
普通对象可以用Object.defineProperty定义属性
例3:JSON.stringify能够打印的内容
类的实例,JSON.stringify只能打印类本身的属性
Object.defineProperty定义的属性,for…in、Object.keys、JSON.stringify都能够循环和打印
Object.defineProperty的enumerable为false时遍历和打印情况
enumerable为false时,for、Object.keys、JSON.stringify都打印不出来
包括类创建的实例,也一样