js实现反射
反射的概念
反射是指在运行时动态获取和操作对象的属性和方法。JavaScript作为动态语言,天生支持反射机制,主要通过内置对象和方法实现。
获取对象属性
使用Object.keys()获取对象所有可枚举属性:
const obj = {a:1, b:2};
console.log(Object.keys(obj)); // ["a", "b"]
Reflect.ownKeys()可以获取包括Symbol在内的所有属性:
const sym = Symbol('key');
const obj = {[sym]: 0, b:1};
console.log(Reflect.ownKeys(obj)); // ["b", Symbol(key)]
检查属性存在
in操作符或Reflect.has()检查属性是否存在:

const obj = {a:1};
console.log('a' in obj); // true
console.log(Reflect.has(obj, 'toString')); // true (继承属性)
调用方法
使用Reflect.apply()动态调用函数:
function sum(a,b) { return a+b; }
console.log(Reflect.apply(sum, null, [1,2])); // 3
修改属性
Reflect.set()动态设置属性值:

const obj = {};
Reflect.set(obj, 'key', 123);
console.log(obj.key); // 123
构造函数调用
通过Reflect.construct()实现动态实例化:
class Person {
constructor(name) { this.name = name; }
}
const instance = Reflect.construct(Person, ['Alice']);
console.log(instance.name); // "Alice"
原型操作
Object.getPrototypeOf()和Reflect.setPrototypeOf()操作原型链:
const obj = {};
const proto = { method(){} };
Reflect.setPrototypeOf(obj, proto);
console.log(Object.getPrototypeOf(obj) === proto); // true
属性描述符
Object.getOwnPropertyDescriptor()获取属性配置:
const obj = { get value(){ return 42; } };
const desc = Object.getOwnPropertyDescriptor(obj, 'value');
console.log(desc.get); // [Function: get value]
注意事项
- 反射操作可能破坏封装性,需谨慎使用
- 某些反射方法会返回布尔值表示操作成功与否(如
Reflect.deleteProperty) - 相比直接操作,反射API提供更规范的错误处理方式






