反射Reflect
Reflect到底是什么?
1.Reflect就是剑js的内置对象,它的主要作用就是提供一些方法,让使用者用这么些方法去访问底层的功能(增删改查)
2.js的底层功能无非就是对对象的的判断增删改查,函数的调用,属性的赋值取值,
3.为什么要使用它,无非就是为了实现函数式编程的思想:减少代码,让代码变得更纯粹,减少符号的使用
Reflect.set(target,name,value)
给对象的属性赋值
const obj = {
name : 'jack',
age : 18,
sex : '男'
}
Reflect.set(obj,'age',20);//将obj中的age改为20
Reflect.get(target,name)
查找并返回target对象的name属性,如果没有该属性,则返回undefine
const obj = {
name : 'jack',
age : 18,
sex : '男'
}
Reflect.get(obj,'ages');//obj中没有ages这个属性就放回undefined
Reflect.get(obj,'name')//返回jack
Reflect.apply(target,this,arguments)
等同于Function.prototype.apply.call(fun,this,arguments)
调用函数,并绑定this和参数列表,等同于函数调用
function fun(a,b){
return a+b
}
Reflect.apply(fun,null,[3,4])
//等同于
fun(3,4)
Reflect.defineProperty(obj, name, desc)
Reflect.defineProperty方法的作用与Object.defineProperty是一样的,都是为对象定义一个属性。但是,Reflect.defineProperty方法失败时,不会抛出错误,只会返回false
// 失败时抛出错误
Object.defineProperty(obj, name, desc);
// 失败时返回false
Reflect.defineProperty(obj, name, desc);
Reflect.construct()
使用构造函数的方式创建对象
function Fun(a,b){
this.a = a;
this.b = b;
}
const t = Reflect.construct(Fun,[1,2])
//等同于
const a = new Fun(1,2)
Reflect.has()
判断对象中是否有这个属性值
const obj = {
name : 'jack',
age : 18,
sex : '男'
}
Reflect.has(obj,"name")
//等同于
'name' in obj
Reflect.deleteProperty()
删除对象中的某一项
const obj = {
name : 'jack',
age : 18,
sex : '男'
}
Reflect.deleteProperty(obj,"sex")
Reflect.setPrototypeOf(obj, newProto)
设置对象的__proto__属性
Object.setPrototypeOf(obj, newProto)
//对应于
Reflect.setPrototypeOf(obj, newProto)
Reflect.getPrototypeOf(obj, newProto)
读取对象的__proto__属性
Object.getPrototypeOf(obj)
//对应于
Reflect.getPrototypeOf(obj, newProto)
代理Proxy
什么是代理?
1.Proxy 用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种“元编程”,即对编程语言进行编程。
举个例子,古代的皇帝每次御膳之前都会有人去试吃一下看有不有问题没问题了好皇帝就是可以去吃了,而中间这个试吃的人就是皇上的代理人。由它来“代理”某些操作
如何创建一个proxy对象
new Proxy(target,handler)
target表示需要代理的对象
handler 表示一个普通的对象,重写底层的方法
返回代理的对象
var obj = new Proxy({}, {
get: function (target, key, receiver) {
console.log(`getting ${key}!`);
return Reflect.get(target, key, receiver);
},
set: function (target, key, value, receiver) {
console.log(`setting ${key}!`);
return Reflect.set(target, key, value, receiver);
}
})
这里对一个空对象重定义了属性的读取(get)和设置(set)行为
当我们去读写他们的时候:
obj.count = 1
// setting count!
++obj.count
// getting count!
// setting count!
// 2
下面是proxy的实例方法,总得来说和Reflect中的方法差不多,只不过一个是操作一个是设置
(1)get(target, propKey,)
设置对象属性的读取,比如proxy.foo和proxy[‘foo’]。
(2)set(target, propKey, value)
设置对象属性的设置,比如proxy.foo = v或proxy[‘foo’] = v,返回一个布尔值。
(3)has(target, propKey)
设置对象的查找操作,以及对象的hasOwnProperty方法,返回一个布尔值。
(4)deleteProperty(target, propKey)
设置对象的删除操作,返回一个布尔值。
(5)apply(target, object, args)
设置对象调用操作比如proxy(…args)、proxy.call(object, …args)、proxy.apply(…)
(13)construct(target, args)
设置 Proxy 实例作为构造函数调用的操作,比如new proxy(…args)。