认识一下JS的Reflect对象

早在ES5标准的时候JS已经有部分反射机制的函数,例如Array.isArray之类的函数,不过由于ES5标准下类的概念尚未规范化,大部分类的
实现都是基于函数,因此反射其实不过是遍历这个函数下的属性罢了。在ES6标准出台后,类的定义有了它自己的标准,因此反射就显得重要了。

Why Reflect

在JAVA或者PHP转过来的后端应该对反射的概念很熟悉,因为在大部分框架的设计底层实现上,反射能够帮助解决很多问题。

MDN文档上介绍,Reflect是一个JS的内置对象,提供了可拦截Javascript操作的方法,这些方法和代理控制者相同。Reflect不是一个函数对象,所以它不能被构造化。

和大部分的全局对象不同,Reflect没有构造器函数。我们不能对它进行new操作或者作为一个函数调用它。Reflect所有的属性和方法都是静态的(跟Math对象一样)。

通过Reflect获取和修改对象的属性

先定义一个测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 class Test{

constructor(){
console.log('invoke');
this.name = 'brown';
}

say(){
console.log('hello',this.name);
}

}

var test = new Test();

test.say();

正常输出是:

1
2
invoke
hello brown

接下来,我们要用Reflect.get(object,property[,this])方法来获取test对象的属性name。

1
2
var name = Reflect.get(test,"name");
console.log(name);

自然可以看到输出的brown,要通过Reflect来修改这个属性也是很简单的

1
Reflect.set(test,"name","Sevens");

##