关于Object.defineProperty中enumerable: false不可枚举的理解

能否被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都打印不出来
在这里插入图片描述
包括类创建的实例,也一样
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值