JS中的可枚举属性与不可枚举属性的学习以及扩展

3,464

定义

在JavaScript中,对象的属性分为可枚举和不可枚举之分,它们是由属性的enumerable值决定的。可枚举性决定了这个属性能否被for…in查找遍历到。

怎么判断属性是否可枚举

js中基本包装类型的原型属性是不可枚举的,如Object, Array, Number等,如果你写出这样的代码遍历其中的属性:


var num = new Number();
for(var pro in num) {
  console.log("num." + pro + " = " + num[pro]);
}

它的输出结果会是空。这是因为Number中内置的属性是不可枚举的,所以不能被for…in访问到。

Object对象的propertyIsEnumerable()方法可以判断此对象是否包含某个属性,并且这个属性是否可枚举。

需要注意的是:如果判断的属性存在于Object对象的原型内,不管它是否可枚举都会返回false。

var person = {
    name:'xiao',
    age: '18',
}
 
Object.defineProperty(person,'age',{
    enumerable:true,//可以被枚举
});
Object.defineProperty(person,'sex',{
    enumerable:false,//不可以被枚举
})
 
person.propertyIsEnumerable('sex');//false
person.propertyIsEnumerable('age');//true

获取对象自身的可枚举属性

  • for...in //只遍历对象自身的和原型上的可枚举的属性
  • Object.keys() //返回对象自身的所有可枚举的属性的键名

for...in 获取可枚举属性

function Test(name){
        this.name=name
    }

    let test=new Test()

    Test.prototype.newF=function(){
        console.log(this.name)
    }
 错误用法:   
for(let key in test){
        console.log(key) //name , newF 获取到了自身和原型上的可枚举属性
    }
正确用法:
利用hasOwnProperty()方法判断自身是否含有这个可枚举属性 过滤掉不在自身的属性
for(let key in test){
        if(test.hasOwnProperty(key)){
            console.log(key) //name 
        }
    }

Object.key() 获取可枚举属性

let keyArr=Object.key(test) //['name']
从输出结果可以发现,这里只输出了对象声明的可枚举属性,但是没有输出原型链中的可枚举属性