Reflect
- 将Object对象的一些明显属于语言内部的方法(比如Object.defineProperty),放到Reflect对象上
- Reflect.get(target,name,receiver)
- Reflect.get方法查找并返回target对象的name属性,如果没有该属性,则返回undefined
- 如果name属性部署了getter,则getter函数的this绑定receiver
const objectReceiver = {
foo:5,
bar:12
}
const targetObject = {
foo:1,
bar:3,
get foo(){
return this.foo + this.bar
}
}
Reflect.get(targetObject,'foo',objectReceiver)
- Reflect.set(target,key,value,receiver)
- Reflect.set方法设置target对象的name属性等于value
- 如果name属性设置了赋值函数,则赋值函数的this绑定receiver。
- 如果 Proxy对象和 Reflect对象联合使用,前者拦截赋值操作,后者完成赋值的默认行为,而且传入了receiver,那么Reflect.set会触发Proxy.defineProperty拦截。
const target = {
a:'a'
}
const handler = {
set(target,key,value,receiver){
Reflect.set(target,key,value)
Reflect.set(target,key,value,receiver)
},
defineProperty(){
console.log('触发difineProperty')
}
}
const proxy = new Proxy(target,handler)
proxy.a = 'A'
console.log(proxy)
- Reflect.has(obj,name)
- Reflect.has方法对应name in obj里面的in运算符。判断对象中是否含有该属性,返回布尔值
- Reflect.deleteProperty(obj,name)
- Reflect.deleteProperty方法等同于delete obj[name],用于删除对象的属性
- Reflect.construct(target,args)
- Reflect.construct方法等同于new target(...args),这提供了一种不使用new,来调用构造函数的方法
```js
function Greeting(name){
this.name = name
}
const greet = Reflect.construct(Greeting,['zhang'])
// 相当于 new Greeting('zhang')
```
- Reflect.getPrototypeOf(obj)
- Reflect.getPrototypeOf方法用于读取对象的__proto__属性,对应Object.getPrototypeOf(obj)
- Reflect.setPrototypeOf(obj,newProto)
- Reflect.setPrototypeOf方法用于设置目标对象的原型(prototype),对应Object.setPrototypeOf(obj, newProto)方法。它返回一个布尔值,表示是否设置成功
```js
// Reflect.setPropotypeOf() --> 将现有对象的原型修改为另一对象
// Object.create() --> 创建对象,将现有对象作为原型
```
- Reflect.apply(func, thisArg, args)
- Reflect.apply方法等同于Function.prototype.apply.call(func, thisArg, args),用于绑定this对象后执行给定函数
- 如果要绑定一个函数的this对象,可以这样写fn.apply(obj, args),但是如果函数定义了自己的apply方法,就只能写成Function.prototype.apply.call(fn, obj, args)
- Reflect.defineProperty(target,propertyKey,descriptor)
- 同 Object.defineProperty
- Reflect.getOwnPropertyDescriptor(target, key)
- 用于得到指定属性的描述对象
```js
const myObj = {};
Object.defineProperty(myObj, 'hidden', {
value: true,
});
const a = Reflect.getOwnPropertyDescriptor(myObj, 'hidden');
console.log(a)
// {
// configurable: true
// enumerable: true
// value: true
// writable: true
//}
```
- Reflect.isExtensible (target)
- 表示当前对象是否可扩展 (可扩展性: 是否可以给对象添加新属性)
- Reflect.preventExtensions(target)
- 用于让一个对象变为不可扩展
- Reflect.ownKeys(target)
- 返回对象的所有属性