js实现反射
反射的概念
反射是指在运行时动态获取和操作对象的属性和方法的能力。JavaScript作为动态语言,本身具备一定的反射特性,可以通过内置方法实现类似功能。
获取对象属性
使用Object.keys()可以获取对象所有可枚举属性的键名数组:
const obj = {a: 1, b: 2};
const keys = Object.keys(obj); // ['a', 'b']
Object.getOwnPropertyNames()返回对象所有属性(包括不可枚举属性):
const props = Object.getOwnPropertyNames(obj); // ['a', 'b']
检查属性存在性
in运算符或hasOwnProperty()方法可检查属性是否存在:
console.log('a' in obj); // true
console.log(obj.hasOwnProperty('b')); // true
动态调用方法
通过字符串形式的属性名可以动态访问方法并执行:
const methodName = 'toString';
obj[methodName](); // "[object Object]"
修改对象结构
Reflect对象提供了一组与对象交互的方法:
Reflect.set(obj, 'c', 3); // 添加新属性
Reflect.deleteProperty(obj, 'a'); // 删除属性
原型操作
通过Object.getPrototypeOf()和Object.setPrototypeOf()可以操作原型链:
const proto = Object.getPrototypeOf(obj);
Object.setPrototypeOf(obj, {d: 4});
函数元信息
函数对象本身也支持反射操作:
function test(a, b) {}
console.log(test.length); // 2
console.log(test.name); // "test"
完整示例
class Person {
constructor(name) {
this.name = name;
}
greet() {
return `Hello, ${this.name}`;
}
}
// 反射操作
const p = new Person('Alice');
const method = 'greet';
console.log(p[method]()); // "Hello, Alice"
// 查看所有属性
console.log(Object.getOwnPropertyNames(p)); // ["name"]
console.log(Object.getOwnPropertyNames(Person.prototype)); // ["constructor", "greet"]
JavaScript的反射能力虽然不如静态语言强大,但通过上述方法已经能满足大多数动态操作需求。ES6引入的Reflect和Proxy对象进一步增强了反射能力。







