早在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
2invoke
hello brown
接下来,我们要用Reflect.get(object,property[,this])
方法来获取test
对象的属性name。1
2var name = Reflect.get(test,"name");
console.log(name);
自然可以看到输出的brown
,要通过Reflect
来修改这个属性也是很简单的1
Reflect.set(test,"name","Sevens");
##