Object
-
获取对象的键名:
Object.keys(obj) -
获取对象的键值:
Object.values(obj) -
获取对象的键值对,返回Map类型:
Object.entries(obj) -
可直接使用for...of遍历Map类型:
for (let [key,value] of Object.entries(obj)) {} -
获取对象非Symbol类型的属性名:
Object.getOwnPropertyNames(obj) -
只获取对象Symbol类型的属性名:
Object.getOwnPropertySymbols(obj) -
获取对象的所有属性名:
Object.ownKeys(obj) -
设置对象的原型对象:
Object.setPrototypeOf(obj, Object) -
将一个键值对Map转化为对象:
Object.fromEntries([['name', 'dd'], ['age', 18], ['sex', 10]]) //{name: 'dd', age: 18, sex: 10} -
获取对象的原型:
Object.getPrototypeOf(obj) -
获取对象属性的所有描述(属性名,value, enumable,writable,configable):
Object.getPropertyDescriptors(obj) -
将属性克隆到一个新对象:
Object.create(Object.getPrototypeOf(a), Object.getPropertyDescriptors(a))
Reflect
Reflect和Proxy一样,是ES6为了操作对象而提供的新API
- 将Object明显属于语言内部的方法(如Object.defineProperty),放到Reflect对象上。某些方法同时在Object和Reflect上部署,未来的方法将只部署在Reflect对象上。
- 修改某些Object方法的返回结果,让其变得更合理
- 让Object操作都变成函数行为,某些Object操作都是命令式的,如
'name' in obj=>Reflect.has(obj, 'name'),delete obj[name]=>Reflect.deleteProperty(obj, name)
Reflect对象的方法和Proxy对象的方法一一对应,只要是Proxy对象的方法,就能在Reflect对象上找到对应的方法
function setRefelect() {
let target={}
const proxy = new Proxy(target, {
set: function(target, prop, value, receiver) {
Reflect.set(target, prop, value, receiver)
},
get: function(target, name) {
Reflect.get(target, name)
},
deleteProperty: function(target, name) {
Reflect.deleteProperty(target, name)
},
has: function(target, name) {
Reflect.has(target, name)
}
})
}
Reflect相关方法:
- 获取对象的原型对象:
Reflect.getPrototypeOf(obj) - 设置对象的原型对象:
Reflect.setPrototypeOf(obj) - 绑定this,执行指定函数Reflect.apply(func, thisArg, args):
Reflect.apply(Math.max, Math, [1,2,3]) - 获取指定对象的描述:
Reflect.getOwnPropertyDescription(obj, 'name') //获取obj对象上的name属性的描述对象 - 判断对象是否可扩展:
Reflect.isExtensible(obj) - 获取对象的所有属性:
Reflect.ownKeys(obj)