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
相关文章
相关标签/搜索