13Reflect
2017-10-30 本文已影响0人
我_巨可爱
概述
Reflect
对象是为了操作对象而提供的新API
有以下特征
- 将
Object
对象上明显属于语言内部的方法,放到Reflect
对象上 - 修改某些返回结果,更加合理
-
Object.defineProperty(obj,name,desc)
当无法定义属性时报错 -
Reflect.defineProperty(obj,name,des)
当无法定义属性时返回false
- 让
Object
的操作都变成函数
-
name in obj
转变成Reflect.has(obj,name)
-
delete obj[name]
转变成Reflect.deleteProperty(obj,name)
-
Reflect
对象的方法和Proxy
上意义对应,不管Proxy
怎么修改默认行为,总可以在Reflect
上获取默认行为
// 获取默认行为
var myObj = {
foo: 1,
// 默认行为
set bar (value) {
return this.foo = value;
}
}
var proxy = new Proxy(myObj,{
// 修改默认行为
set: function (target,key,value,receiver) {
return target.foo = value + 1;
}
});
// set
proxy.foo = 5; // 使用代理上的方法,myObj 上属性进行相应的改变
Reflect.set(myObj,foo,5); // 使用对象上的set方法
console.log(myObj.foo);
基础案例
receiver 方法一般指的是该方法内的
this
指向
var myObject = {
foo: 4,
set bar(value) {
return this.foo = value;
}
};
var myReceiverObject = {
foo: 0
}
Reflect.set(myObject,'bar',1,myReceiverObject);
myObject.foo //4
myReceiverObject.foo //1
各种方法
- Reflect.apply(target,thisArg,args)
- Reflect.construct(target,args)
- Reflect.get(target,name,receiver)
- Reflect.set(target,name,value,receiver)
- Reflect.defineProperty(target,name,desc)
- Reflect.deleteProperty(target,name)
- Reflect.has(target,name)
- Reflect.ownKeys(target)
- Reflect.isExtensible(target)
- Reflect.preventExtensions(target)
- Reflect.getOwnPropertyDescriptor(target, name)
- Reflect.getPrototypeOf(target)
- Reflect.setPrototypeOf(target, prototype)