ES6之Object与Reflect

266 阅读1分钟

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)