Skip to content

反射

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)

༼ つ/̵͇̿̿/’̿’̿ ̿ ̿̿ ̿̿◕ _◕ ༽つ/̵͇̿̿/’̿’̿ ̿ ̿̿ ̿̿ ̿̿