反射
Proxy
Proxy 对象用于创建一个对象的代理,从而实现基本操作的拦截和自定义(如属性查找、赋值、枚举、函数调用等)。
语法
js
/**
* @param {*} target 要使用 Proxy 包装的目标对象(可以是任何类型的对象,包括原生数组,函数,甚至另一个代理)。
* @param {object} handler 一个通常以函数作为属性的对象,各属性中的函数分别定义了在执行各种操作时代理 p 的行为。
* @returns {*} Proxy 包装的目标对象
*/
new Proxy(target, handler);
/**
* @param {*} target 要使用 Proxy 包装的目标对象(可以是任何类型的对象,包括原生数组,函数,甚至另一个代理)。
* @param {object} handler 一个通常以函数作为属性的对象,各属性中的函数分别定义了在执行各种操作时代理 p 的行为。
* @returns {*} Proxy 包装的目标对象
*/
new Proxy(target, handler);
示例
js
// 示例
var target = {};
var handler = {
get: function (target, prop, receiver) {
const val = Reflect.get(...arguments);
console.log("访问属性: " + prop);
// 嵌套对象递归代理
return typeof val === "object" ? new Proxy(val, handler) : val;
},
// has: function (target, prop) {},
// set: function(target, property, value, receiver) {}
// apply: function (target, thisArg, argumentsList) {},
// construct: function (target, argumentsList, newTarget) {},
// defineProperty: function (target, property, descriptor) {},
// deleteProperty: function (target, property) {},
// getOwnPropertyDescriptor: function (target, prop) {},
// setPrototypeOf: function (target, prototype) {},
// getPrototypeOf(target) {}
// isExtensible: function (target) {},
// ownKeys: function (target) {},
// preventExtensions: function (target) {},
};
var p = new Proxy(target, handler);
console.log(p.a); // "called: a"; ouptut 10
// 示例
var target = {};
var handler = {
get: function (target, prop, receiver) {
const val = Reflect.get(...arguments);
console.log("访问属性: " + prop);
// 嵌套对象递归代理
return typeof val === "object" ? new Proxy(val, handler) : val;
},
// has: function (target, prop) {},
// set: function(target, property, value, receiver) {}
// apply: function (target, thisArg, argumentsList) {},
// construct: function (target, argumentsList, newTarget) {},
// defineProperty: function (target, property, descriptor) {},
// deleteProperty: function (target, property) {},
// getOwnPropertyDescriptor: function (target, prop) {},
// setPrototypeOf: function (target, prototype) {},
// getPrototypeOf(target) {}
// isExtensible: function (target) {},
// ownKeys: function (target) {},
// preventExtensions: function (target) {},
};
var p = new Proxy(target, handler);
console.log(p.a); // "called: a"; ouptut 10
Reflect
Reflect 是一个内置的对象,它提供拦截 JavaScript 操作的方法。这些方法与 proxy handler 的方法相同。Reflect 不是一个函数对象,因此它是不可构造的。Reflect 的所有属性和方法都是静态的(就像 Math 对象)。
js
// 示例
const duck = {
name: "Maurice",
color: "white",
greeting: function () {
console.log(`Quaaaack! My name is ${this.name}`);
},
};
Reflect.has(duck, "color"); // true
Reflect.has(duck, "haircut"); // false
Reflect.ownKeys(duck); // [ "name", "color", "greeting" ]
Reflect.set(duck, "eyes", "black");
// 其他方法
// Reflect.apply(target, thisArgument, argumentsList)
// Reflect.construct(target, argumentsList[, newTarget])
// Reflect.defineProperty(target, propertyKey, attributes)
// Reflect.deleteProperty(target, propertyKey)
// Reflect.get(target, propertyKey[, receiver])
// Reflect.getOwnPropertyDescriptor(target, propertyKey)
// Reflect.getPrototypeOf(target)
// Reflect.has(target, propertyKey)
// Reflect.isExtensible(target)
// Reflect.ownKeys(target)
// Reflect.preventExtensions(target)
// Reflect.set(target, propertyKey, value[, receiver])
// Reflect.setPrototypeOf(target, prototype)
// 示例
const duck = {
name: "Maurice",
color: "white",
greeting: function () {
console.log(`Quaaaack! My name is ${this.name}`);
},
};
Reflect.has(duck, "color"); // true
Reflect.has(duck, "haircut"); // false
Reflect.ownKeys(duck); // [ "name", "color", "greeting" ]
Reflect.set(duck, "eyes", "black");
// 其他方法
// Reflect.apply(target, thisArgument, argumentsList)
// Reflect.construct(target, argumentsList[, newTarget])
// Reflect.defineProperty(target, propertyKey, attributes)
// Reflect.deleteProperty(target, propertyKey)
// Reflect.get(target, propertyKey[, receiver])
// Reflect.getOwnPropertyDescriptor(target, propertyKey)
// Reflect.getPrototypeOf(target)
// Reflect.has(target, propertyKey)
// Reflect.isExtensible(target)
// Reflect.ownKeys(target)
// Reflect.preventExtensions(target)
// Reflect.set(target, propertyKey, value[, receiver])
// Reflect.setPrototypeOf(target, prototype)