Reflect

一:歸納函數

(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
相關文章
相關標籤/搜索