目录
2.使用Object.defineproperty增加属性或方法
5.Object.getOwnPropertySymbols
一、前情提要
先来看一下Object.defineproperty。
Object.defineproperty 就是直接在一个对象上定义一个新属性,或者修改一个已经存在的属性。
1.一个对象增加属性或方法,一般这样做
let params = {};
//新增name属性
params.name="CSDN";
//新增userAction方法
params.userAction=function() {
console.log("这是新添加的方法");
};
console.log(parmas);
//结果打印{name: 'CSDN', userAction: ƒ}
2.使用Object.defineproperty增加属性或方法
Object.defineproperty(obj, prop, desc )
参数1:obj 需要定义属性的当前对象
参数2:prop 当前需要定义的属性名
参数3:desc 描述符 一般是一个对象
let params = {};
Object.defineProperty(params,'name',{
value:'CSDN'
});
Object.defineProperty(params,'userAction',{
value:function() {
console.log("这是新添加的方法");
}
});
//其它属性如下,此处不做分析
//writable:是否可重写
//value:当前值
//get:读取时内部调用的函数
//set:写入时内部调用的函数
//enumerable:是否可枚举
//configurable:是否可再次修改配置项
二、获取对象的key的方法比较
我们定义两个对象parent和children。
parent中定义了:
parentName:可枚举属性
parentAge:不可枚举属性
parentSex属性
parent的symbol属性
//定义parent对象
let parent = {};
Object.defineProperty(parent,'parentName',{
value:'这是parentName',
enumerable:true,//可枚举
});
Object.defineProperty(parent,'parentAge',{
value:'这是parentAge',
enumerable:false,//不可枚举
});
Object.defineProperty(parent,'parentSex',{
value:Symbol("男性"),
enumerable:true,
});
let parentIdCard = Symbol('身份证号');
parent[parentIdCard] = parentIdCard;
console.log(parent);
parent打印结果:
childeren中定义了:
childrenName:可枚举属性
childrenAge:不可枚举属性
childrenSex属性
children的symbol属性
//定义children对象
let children = {};
Object.defineProperty(children,'childrenName',{
value:'这是childrenName',
enumerable:true,//可枚举
});
Object.defineProperty(children,'childrenName',{
value:'这是childrenName',
enumerable:false,//不可枚举
});
Object.defineProperty(children,'childrenSex',{
value:Symbol("男性"),
enumerable:true,
});
let childrenIdCard = Symbol('身份证号');
children[childrenIdCard] = childrenIdCard;
console.log(children);
children.__proto__ = parent;
children打印结果:
children继承parent;
1.for in
for(let p in children) {
console.log(p);
}
结果如下:
可见for in 遍历了自身和继承的所有可枚举属性;不包含不可枚举和Symbol属性
2.Object.keys
console.log(Object.keys(children));
结果如下:
可见Object.keys执行后会返回一个数组,而且只遍历了自身可枚举的属性;不包括不可枚举和Symbol属性
3.Object.getOwnPropertyNames
console.log(Object.getOwnPropertyNames(children));
结果如下:
可见Object.getOwnPropertyNames执行后返回一个数组,遍历了自身的可枚举属性和不可枚举属性;不包含Symbol属性
4.Reflect.ownKeys
console.log(Reflect.ownKeys(children));
可见Reflect.ownKeys执行后返回一个数组,遍历了自身所有属性,包括可枚举、不可枚举、Symbol属性
5.Object.getOwnPropertySymbols
console.log(Object.getOwnPropertySymbols(children));
结果如下:
可见 Object.getOwnPropertySymbols执行后返回一个数组,遍历了对象自身的所有Symbol属性
总结
for in:遍历自身的和继承的全部可枚举属性。不包括不可枚举属性和Symbol属性
Object.keys():返回一个数组;获取自身(不含继承)可枚举属性。不包括不可枚举属性、Symbol属性
Object.getOwnPropertyNames:返回一个数组;获取自身全部(不含继承)属性名称,包括不可枚举属性,不包括Symbol属性
Object.getOwnPropertySymbols:返回一个数组,遍历了对象自身的所有Symbol属性
Reflect.ownKeys:返回一个数组;获取自身(不含继承)全部属性名称,包括不可枚举属性、Symbol。其实就是Object.getOwnPropertyNames与Object.getOwnPropertySymbols之和
只有for in 包含继承的可枚举属性;
只有Object.getOwnPropertySymbols和Reflect.ownKeys可以包含Symbol属性;
只有Object.getOwnPropertyNames和Reflect.ownKeys包含不可枚举属性;