相关链接
代码地址
- 静态方法:gitee.com/carrierxia/…
- handler对象方法:gitee.com/carrierxia/…
Reflect 静态方法
-
属性访问相关:
Reflect.get(target, propertyKey[, receiver]):获取对象target上属性propertyKey的值,类似target[propertyKey]。如果提供receiver,且target的属性是一个 getter 函数 ,则receiver会作为函数运行时的this值。
let obj = { x: 1, y: 2 };
console.log(Reflect.get(obj, 'x')); // 输出 1
Reflect.set(target, propertyKey, value[, receiver]):设置对象target上属性propertyKey的值为value,类似target[propertyKey] = value。如果设置成功返回true,失败返回false。当target和receiver不同时,会使用target的属性描述符(查找 setter 或判断属性是否可写),但在receiver上设置属性 。
let obj = {};
console.log(Reflect.set(obj, 'name', 'Alice')); // 输出 true
Reflect.has(target, propertyKey):判断对象target是否存在属性propertyKey,和in运算符功能相同,返回true或false。
let obj = { x: 1 };
console.log(Reflect.has(obj, 'x')); // 输出 true
-
函数调用相关:
Reflect.apply(target, thisArgument, argumentsList):对函数target进行调用,thisArgument作为函数执行时的this值,argumentsList是参数数组,和Function.prototype.apply()功能类似。
function add(a, b) {
return a + b;
}
console.log(Reflect.apply(add, null, [1, 2])); // 输出 3
Reflect.construct(target, argumentsList[, newTarget]):对构造函数target进行new操作,相当于执行new target(...argumentsList),可指定newTarget来确定最终实例的原型。
function Person(name) {
this.name = name;
}
let alice = Reflect.construct(Person, ['Alice']);
console.log(alice.name); // 输出 Alice
-
属性定义与删除相关:
Reflect.defineProperty(target, propertyKey, attributes):和Object.defineProperty()类似,用于定义或修改对象target上属性propertyKey的描述符attributes,设置成功返回true,否则返回false。
let obj = {};
console.log(Reflect.defineProperty(obj, 'name', {
value: 'Bob',
writable: false
})); // 输出 true
Reflect.deleteProperty(target, propertyKey):作为函数形式的delete操作符,删除对象target上的属性propertyKey,成功返回true,失败返回false。
let obj = { x: 1 };
console.log(Reflect.deleteProperty(obj, 'x')); // 输出 true
-
原型与描述符相关:
Reflect.getPrototypeOf(target):类似于Object.getPrototypeOf(),返回对象target的原型。Reflect.setPrototypeOf(target, prototype):设置对象target的原型为prototype,设置成功返回true,失败返回false。Reflect.getOwnPropertyDescriptor(target, propertyKey):类似于Object.getOwnPropertyDescriptor(),如果对象target中存在属性propertyKey,则返回对应的属性描述符,否则返回undefined。
-
其他:
Reflect.isExtensible(target):类似于Object.isExtensible(),判断对象target是否可扩展(是否可以添加新属性)。Reflect.preventExtensions(target):阻止向对象target添加新属性,返回一个布尔值表示操作是否成功。Reflect.ownKeys(target):返回一个包含对象target所有自身属性(不包含继承属性)的数组,不受属性enumerable特性影响。
handler 对象方法(与 Reflect 静态方法对应)
在使用 Proxy 时,handler 对象是用于定义代理行为的配置对象,其方法与 Reflect 的静态方法命名相同,功能也类似,用于拦截对象的各种操作:
handler.get(target, propertyKey, receiver):拦截对象属性的读取操作,和Reflect.get类似,参数意义相同。handler.set(target, propertyKey, value, receiver):拦截对象属性的设置操作,对应Reflect.set。handler.has(target, propertyKey):拦截in操作符,对应Reflect.has。handler.apply(target, thisArgument, argumentsList):拦截函数调用,对应Reflect.apply。handler.construct(target, argumentsList, newTarget):拦截new操作,对应Reflect.construct。handler.defineProperty(target, propertyKey, attributes):拦截对象属性的定义操作,对应Reflect.defineProperty。handler.deleteProperty(target, propertyKey):拦截delete操作,对应Reflect.deleteProperty。handler.getPrototypeOf(target):拦截获取对象原型的操作,对应Reflect.getPrototypeOf。handler.setPrototypeOf(target, prototype):拦截设置对象原型的操作,对应Reflect.setPrototypeOf。handler.getOwnPropertyDescriptor(target, propertyKey):拦截获取对象属性描述符的操作,对应Reflect.getOwnPropertyDescriptor。handler.isExtensible(target):拦截判断对象是否可扩展的操作,对应Reflect.isExtensible。handler.preventExtensions(target):拦截阻止对象扩展的操作,对应Reflect.preventExtensions。handler.ownKeys(target):拦截获取对象自身属性键的操作,对应Reflect.ownKeys。