js 实现反射
反射的基本概念
反射是指在运行时动态获取和操作对象的属性和方法。JavaScript 本身没有内置的反射机制,但可以通过一些方法和技巧实现类似的功能。
获取对象的属性和方法
使用 Object.keys()、Object.getOwnPropertyNames() 或 Reflect.ownKeys() 可以获取对象的属性列表。
const obj = { a: 1, b: 2 };
console.log(Object.keys(obj)); // ["a", "b"]
console.log(Object.getOwnPropertyNames(obj)); // ["a", "b"]
console.log(Reflect.ownKeys(obj)); // ["a", "b"]
动态访问属性
使用方括号语法可以动态访问对象的属性。

const obj = { a: 1, b: 2 };
const propName = 'a';
console.log(obj[propName]); // 1
调用方法
使用 Reflect.apply() 或直接通过方括号语法调用方法。
const obj = {
greet: function(name) {
return `Hello, ${name}`;
}
};
const methodName = 'greet';
console.log(obj[methodName]('World')); // "Hello, World"
console.log(Reflect.apply(obj[methodName], obj, ['World'])); // "Hello, World"
修改属性
使用 Reflect.set() 或直接赋值可以动态修改属性。

const obj = { a: 1, b: 2 };
Reflect.set(obj, 'a', 10);
console.log(obj.a); // 10
obj['b'] = 20;
console.log(obj.b); // 20
检查属性是否存在
使用 Reflect.has() 或 in 操作符可以检查属性是否存在。
const obj = { a: 1, b: 2 };
console.log(Reflect.has(obj, 'a')); // true
console.log('b' in obj); // true
创建代理对象
使用 Proxy 可以创建一个代理对象,拦截对目标对象的操作。
const target = { a: 1, b: 2 };
const handler = {
get: function(target, prop) {
return prop in target ? target[prop] : 0;
}
};
const proxy = new Proxy(target, handler);
console.log(proxy.a); // 1
console.log(proxy.c); // 0
获取和设置原型
使用 Object.getPrototypeOf() 和 Object.setPrototypeOf() 可以获取和设置对象的原型。
const obj = {};
const proto = { a: 1 };
Object.setPrototypeOf(obj, proto);
console.log(Object.getPrototypeOf(obj) === proto); // true






