一:歸納函數
(1)將Object對象的一些明顯的內部語言放進了Reflect對象中,在將來的新方法將只部署到Reflect上。this
(2)修改某些Object方法返回的結果更加合理。好比在Object沒法定義屬性時會報錯,可是Reflect不會。spa
//Object try{ Object.defineProperty(target,property,attributes) //success }catch(e){ //failure } //Reflect if(Reflect.defineProperty(target,property,attributes)){ //success }else{ failure }
(3)讓Object操做都變成函數行爲,好比以前的in,delete 命令式方法都變成函數方法code
//Object 'assign' in Object //true //Reflect Reflect.has(Object,'assign'); //true
(4)Reflect對象的方法與Proxy對象的方法一一對應,只要是Proxy對象的方法,就能在Reflect對象上找到對應的方法。這就能夠用Proxy方法調用對應的Reflect方法完成默認行爲。對象
Proxy(target,{ set:function(target,name,value,receiver){ var success = Reflect.set(target,name,value,receiver); if(success){ console.log('property' + name + 'on set to' +value) } return success } }) Proxy.name = '你好' console.log(Proxy.name) 'property name on set to 你好' //Proxy對象攔截了target對象的屬性賦值行爲,而後採用Reflect.set()將值賦值給對象的屬性,確保完成原有的行爲,而後再部署額外的功能。
經常使用的幾種方法blog
注:若是第一參數不是對象則報錯部署
(1)Reflect.get(target,name,receiver)get
返回target對象的那麼屬性,若是沒有該屬性,則返回undefinedio
//沒有部署讀取函數 var obj = { foo:2 } var myObj = { foo:3 } Reflect.get(obj,'foo')// 2 Reflect.get(obj,'foo',myObj)// 2 //部署讀取函數,讀取函數的this會綁定到receiver var obj = { get bar(){ console.log(this) } } var myObj = { foo:3 } Reflect.get(obj,'bar')// obj,由於沒有receiver參數 Reflect.get(obj,'bar',myObj)// myObj
(2)Reflect.set(target,name,value,receiver)console
設置target的name屬性等於value
//有設置賦值函數,可是沒有receiver參數 var obj ={ foo:2 set bar(value){ return this.foo = value; } } console.log(obj.foo) //1 Reflect.set(obj,'foo',2) console.log(obj.foo) //2 Reflect.set(obj,'bar',3) console.log(obj.foo) //3 //有設置賦值函數,則賦值函數的this綁定receiver,存在receiver參數 var obj= { foo: 4, set bar(value) { return this.foo = value; }, }; var myObj= { foo: 0,
Reflect.set(obj,'bar',5,myObj); //賦值函數的this,即obj的this指向了myObj。因此myObj的foo被賦值了。 console.log(myObj.foo) //5