Reflect反射
es6提供了一个全新的api----Reflect,其将object对象一些内部的方法,放到Reflect对象上,将来可能彻底取代Object对象内部的这些方法,方法的返回值也更改为true或false
new.target
在介绍API之前我们先说一个属性,new.targer指向直接被new执行的构造函数
在函数中使用
在函数中使用new.target,会返回undefined,可以用来判断一个函数是否作为构造函数来使用
(function(){ console.log(new.target) // undefined }())
在构造函数中使用
构造函数中的new.target,会指向被new执行的构造函数,如下所示class A{ constructor(){ console.log(new.target) // [class A] console.log(new.target.name) // A } } class B extends A{ constructor(){ super() // [class B extends A] // B } }
API
下面我们介绍一下Reflect的API
Reflect.construct(c, args, 可选newTarget)
当传两个参数时,类似new运算符,返回一个实例对象,第一个参数为构造函数,第二个参数为参数组成的数组function x(){} Reflect.construct(x, []) // x {}当传第3个参数时,前两个参数不变,第三个参数为一个新的构造函数,如下代码所示 函数执行并没有变,this.a this.b还是x1中的值,但new.target变为了x2,所以其实,第三个参数的作用就是改变了new.target的指向,将其指向为第三个参数
function x1(){ this.a = 10 this.b = 20 console.log(this.a, this.b, new.target) } function x2(){ this.a = 100 this.b = 200 console.log(this.a, this.b, new.target) } let o1 = Reflect.construct(x1, [], x2) // 10 20 [Function: x2]
Reflect.set(o, name, value, 可选receiver)
类似 o[name] = value 成功返回true,失败返回false,若o不是对象抛出TypeError, 如果指定了可选参数receiver,则将其做为receiver中的方法调用,如下代码所示:let n1 = { a:1 } let n2 = { a:3 } Reflect.set(n1, "b", 10, n2) n1 // { a: 1 } n2 // { a: 3, b: 10 }