可枚举性
对应有道云笔记地址(有道云上排版更优):http://note.youdao.com/noteshare?id=48a9a79bcd3f66d43f253053462296ab&sub=B84D11849DA84E2A813E09A073E30578
时间:2018.08.07
参考:https://blog.csdn.net/GXing007/article/details/79529307
https://segmentfault.com/a/1190000011294519
可枚举性
什么是可枚举性?
对象的每一个属性都有一个描述对象,用来描述和控制该属性的行为,用Object.getOwnPropertyDescriptor方法来获取该描述对象(用Object.defineProperty方法来设置)。
eg:
let obj = { foo: 123 };
Object.getOwnPropertyDescriptor(obj, 'foo')
// {
// value: 123,
// writable: true,
// enumerable: true,
// configurable: true
// }
描述对象的enumerable属性,称为”可枚举性“,如果该属性为false,就表示某些操作会忽略当前属性。
目前,有四个操作会忽略enumerable为false的属性。
for...in循环:只遍历对象自身的和继承的可枚举的属性。
Object.keys():返回对象自身的所有可枚举的属性的键名。
JSON.stringify():只串行化对象自身的可枚举的属性。
Object.assign(): 忽略enumerable为false的属性,只拷贝对象自身的可枚举的属性。
我们通过Object.defineProperty将对象的某一属性设为不可枚举,则用for..in、Object.keys等方法不会遍历到该属性
eg:
var obj = {};
Object.defineProperty(obj,"name",{
configurable: false,
writable: true,
enumerable: false,
value: '张三'
});
Object.keys(obj); //[]
下面,我们分别介绍下对象属性的描述对象的4个属性:
configurable:表示能否通过delete删除此属性,能否修改属性的特性,或能否修改把属性修改为访问器属性,如果直接使用字面量定义对象,默认值为true
enumerable: 表示该属性是否可枚举,即是否通过for-in循环或Object.keys()返回属性,如果直接使用字面量定义对象,默认值为true
writable: 能否修改属性的值,如果直接使用字面量定义对象,默认值为true
value: 该属性对应的值,默认为undefined
扩展
可以用Object.defineProperty添加存取方法(set和get、vue是实现双向绑定的原理就是通过defineProperty去修改get和set方法)
eg:
var obj3 = {},
var a = 1;
Object.defineProperty(obj3,"name",{
configurable:true,
enumerable:true,
get:function(){
return a;
},
set:function(newValue){
a = newValue+1;
}
});
obj3.name =>1
obj3.name = 2;
obj3.name =>3
注意:
1.get和set可以不同时使用,但在严格模式下只其中一个,会抛出错误