Object.defineProperty的可枚举属性的定义,可枚举属性的设置以及可枚举属性的用处

1、什么是枚举?(百度百科)

枚举:在数学和计算机科学理论中,一个集的枚举列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。是一个被命名的整型常数的集合,枚举在日常生活中很常见,例如表示星期的SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY就是一个枚举。

可枚举:显而易见,就是某些有穷序列集的可以被枚举的成员。(对象循环的时候,需要循环的数据或者属性)

不可枚举:显而易见,就是某些有穷序列集的不可以被枚举的成员。(对象循环的时候,不需要循环的数据或者属性)

2、defineProperty的可枚举属性的设置

Object.defineProperty()

当且仅当该属性的 enumerable 为 true时,该属性才能够出现在对象的枚举属性中。默认为 false

  • for...in循环:只遍历对象自身的和继承的可枚举的属性。
  • Object.keys():返回对象自身的所有可枚举的属性的键名。
  • JSON.stringify():只串行化对象自身的可枚举的属性。
  • Object.assign(): 忽略enumerablefalse的属性,只拷贝对象自身的可枚举的属性。

这四个操作之中,前三个是 ES5 就有的,最后一个`Object.assign()`是 ES6 新增的。其中,只有`for...in`会返回继承的属性,其他三个方法都会忽略继承的属性,只处理对象自身的属性。实际上,引入“可枚举”(`enumerable`)这个概念的最初目的,就是让某些属性可以规避掉`for...in`操作,不然所有内部属性和方法都会被遍历到。比如,对象原型的`toString`方法,以及数组的`length`属性,就通过“可枚举性”,从而避免被`for...in`遍历到。

var obj = {
    a:1,
    showValue(value){
        console.log(value)
    }
};
Object.defineProperty(obj, 'showValue', {
    enumerable: false
});
console.log(obj)                // {a: 1, showValue: ƒ}        
obj.showValue(666)              // 666
for(index in obj){
    console.log(obj[index])     // 1
}
console.log(Object.keys(obj))   // ["a"]
console.log(JSON.stringify(obj))// {"a":1}
const obj2 = Object.assign({b: 2}, obj); 
console.log(obj2)               // {b: 2, a: 1}, showValue方法不可枚举,所以不能拷贝

3、设置对象的属性可不可以枚举,这到底有什么用?

在一个 obj 对象初始化的时候,如果需要对 obj 对象的数据进行遍历初始化或者遍历修改、但是不需要修改这个对象里面的定义的一些方法,例如只需要对 obj.a 、obj.b 初始化为 0 ,而不需要初始化 obj.showValue 的方法的时候,这个时候,可枚举就可以帮我们避免一些不需要的常量或者方法被`for...in`等四种遍历方法遍历到,就是相当于一个对象有 100 个属性或者方法,但是我们只需要对象里面的 10 个属性或者方法进行遍历修改的时候,这个时候就可以大大提高 obj 对象遍历的性能了,减少对无用的遍历操作了。

你可能感兴趣的:(defineProperty)