什么是反射?ES6提供了新的操作对象的API,以后的新方法只会部署在Reflect对象上!Reflect初探Reflect和Proxy是互补的,只要是Proxy对象的方法,都可以在Reflect对象上找到对应的方法!constobj={名称:“歌曲”};constproxy=newProxy(obj,{get(target,name){//reflect保证native行为可以正常执行returnReflect.get(target,name);},set(target,name,value){returnReflect.set(target,name,value);},has(target,name){//has方法将由in运算符调用returnReflect.has(target,name);}});//reflect转换将原始命令转换为功能行为console.log("name"inproxy);console.log(Reflect.has(proxy,"name"));//也是直接通过Reflect来判断Reflect静态方法Reflect对象一共有13个静态方法。让我们依次比较一下新旧写法吧!1.Reflect.get获取对象中对应key的值constmy={name:'song',age:18,getmny(){returnthis.a+this.b}}console.log(my['年龄']);//旧式console.log(Reflect.get(my,'age'));console.log(Reflect.get(my,'mny',{a:1,b:2}));//可以指定this指向2.Reflect.set设置对象中key对应的valueconstmy={name:"song",age:18,setmny(val){this.value=val;}};让mny={值:0};my.m纽约州=100;//旧的写法Reflect.set(my,"mny",100);Reflect.set(my,"mny",100,mny);//设置对象的属性并传递thisconsole.log(mny);//{value:100}3.Reflect.has判断一个key是否属于这个对象constmy={name:'song'}console.log('name'inmy);console.log(Reflect.has(my,'name'));4.Reflect.defineProperty定义对象的属性和值,相当于Object.definePropertyconstperson={};Object.defineProperty(person,'name',{configurable:false,value:'song'});console.log(person.name);//老写法,后面会舍弃Reflect.defineProperty(person,'name',{configurable:false,value:'song'})console.log(person.name);5.Reflect.deleteProperty删除一个属性在对象中constperson={};Reflect.defineProperty(person,'name',{configurable:false,value:'song'});//deleteperson.name;Noreturnvalueconstflag=Reflect.deleteProperty(person,'名称');console.log(标志);//返回是否删除成功6.Reflect.construct实例化类,相当于newclassPerson{constructor(sex){console.log(sex);}}newPerson('女性');//旧的写法Reflect.construct(Person,['male']);7.Reflect.getPrototypeOf读取proto,相当于Object.getPrototypeOf,不同的是,如果传递的方法不是对象,会报错!classPerson{}//旧的写法console.log(Object.getPrototypeOf(Person)===Reflect.getPrototypeOf(Person));8.Reflect.setPrototypeOf设置proto,相当于Object.setPrototypeOf,但是返回一个boolean类型表示是否设置成功!letperson={name:'song'};letobj={age:18};//Object.setPrototypeOf(person,obj);//老方法Reflect.setPrototypeOf(person,obj);console.log(person.age);9.Reflect.apply大家一定很好理解,Reflect.apply相当于Function.prototype.apply.callconstfunc=function(a,b){console.log(this,a,b);}func.apply=()=>{console.log('apply')}//func.apply({name:'song'},[1,2]);//在其自身上调用方法Function.prototype.apply.call(func,{name:'song'},[1,2]);//老办法Reflect.apply(func,{name:'song'},[1,2]);//是不是很简单!10.Reflect.getOwnPropertyDescriptor等同于Object.getOwnPropertyDescriptor,获取属性描述对象constobj={name:1};//constdescriptor=Object.getOwnPropertyDescriptor(obj,'name');//旧方法constdescriptor=Reflect.getOwnPropertyDescriptor(obj,'name');console.log(descriptor);11.Reflect.preventExtensions使一个对象不可扩展,即永远不能添加新的属性,相当于Object.preventExtensionsconstperson={};//老写法目的。防止扩展(人);//将对象设置为可扩展Reflect.preventExtensions(person);人.a=1;console.log(person.a);//undefined12.Reflect.isExtensible表示当前对象是否可扩展,相当于Object.isExtensibleconstperson={};Reflect.preventExtensions(person);Object.isExtensible(person)//老写法falseReflect.isExtensible(person)//false13.Reflect.ownKeys用于返回对象的所有属性,包括Symbol属性constperson={age:18,[Symbol('name')]:'song'};console.log(Object.getOwnPropertyNames(person));//['age']旧方法console.log(Object.getOwnPropertySymbols(person));//[Symbol(name)]旧的写法console.log(Reflect.ownKeys(person));//['age',Symbol(name)]至此我们已经讲解完了Reflect的所有用法,内容比较干!其实核心就是把原来Object的一些方法放在Reflect上。至于难度,我压根没见过!
