JS

JS中的枚举和不可枚举

2019-03-12  本文已影响0人  darkTi

一、枚举是什么

基本包装类型:Boolean,Number和String,就是即是基本类型,也是引用类型。基本包装类型还可以像引用类型一样通过对象的方法访问它自带的一些方法,但是不能像引用类型那样自定义方法。

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

结果为空,因为Number中内置的属性是不可枚举的;

propertyIsEnumerable() 方法返回一个布尔值,表示指定的属性是否可枚举。但是在原型链上propertyIsEnumerable不被考虑
hasOwnProperty()方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性

二、枚举性的作用

for…in

Object.keys()

JSON.stringify()
举例

function enumer(){
      this.a = '我是对象本身就有的属性'
}
enumer.prototype.b = '我是通过对象原型挂载的属性'
let fn = new enumer()
Object.defineProperty(fn,'c',{
     value:'我是通过Object.defineProperty方法添加的可枚举属性',
     enumerable:true
})

1、 .for…in循环可以枚举(遍历)出对象本身具有的属性,通过Object.defineProperty()方法加的可枚举属性,或者通过原型对象绑定的可以枚举属性。

for(let pro in fn){
   console.log(pro)
}  
/*输出*/
//a
//b
//c

2、 Object.keys()方法可以枚举实例对象本身的属性和通过Object.defineProperty()添加的可枚举属性,即不会枚举原型链上的属性

console.log(Object.keys(fn))
/*输出*/
//['a','c']

3、JSON.stringify()方法只能序列化实例对象本身的属性和通过Object.defineProperty()添加的可枚举属性为JSON对象,即不会序化原型链上的属性

console.log(JSON.stringify(fn))
//{"a":"我是对象本身就有的属性","c":"我是通过Object.defineProperty方法添加的可枚举属性"}

为什么要加上实例二字呢?请看下面

image.png
上一篇 下一篇

猜你喜欢

热点阅读