面试题答案
一键面试1. JavaScript 反射 API 简介
在 JavaScript 中,反射 API 主要指的是 Reflect
对象,它提供了一系列与对象相关的操作方法,与 Object
类似,但更符合函数式编程风格,且在处理对象属性和方法的操作上更灵活。
2. 动态访问继承体系中的属性与方法
- 访问父类和子类的属性:
- 可以使用
Reflect.get(target, propertyKey[, receiver])
方法来获取对象的属性值。target
是要获取属性的对象,propertyKey
是属性名,receiver
是可选参数,当获取的属性是一个函数时,用于指定函数执行时的this
值。 - 对于继承体系,子类实例会继承父类的属性。通过
Reflect.get
可以获取到父类和子类的属性。
- 可以使用
- 访问子类特有的属性:
- 子类特有的属性在子类的原型或实例上定义。同样使用
Reflect.get
,通过子类实例访问这些属性。如果属性是在子类原型上定义的,只要实例没有同名属性遮蔽它,就能获取到。
- 子类特有的属性在子类的原型或实例上定义。同样使用
- 重写父类方法时的反射操作:
- 当子类重写父类方法时,通过
Reflect.get
获取方法时,会优先获取子类重写的方法。如果需要获取父类的原始方法,可以通过super
关键字结合Reflect.get
来实现。
- 当子类重写父类方法时,通过
3. 代码示例
class Parent {
constructor() {
this.parentProp = 'parent value';
}
parentMethod() {
return 'parent method';
}
}
class Child extends Parent {
constructor() {
super();
this.childProp = 'child value';
}
childMethod() {
return 'child method';
}
parentMethod() {
return 'overridden parent method';
}
}
// 创建子类实例
const child = new Child();
// 访问子类特有的属性
const childPropValue = Reflect.get(child, 'childProp');
console.log('Child specific property value:', childPropValue);
// 访问重写的父类方法
const overriddenMethod = Reflect.get(child, 'parentMethod');
console.log('Overridden parent method result:', overriddenMethod());
// 访问父类原始方法(需要通过super来访问)
class Child2 extends Parent {
constructor() {
super();
}
callParentMethod() {
return Reflect.get(super, 'parentMethod')();
}
}
const child2 = new Child2();
console.log('Parent original method result:', child2.callParentMethod());
4. 总结
通过 Reflect
对象提供的方法,我们可以灵活地动态访问和操作 JavaScript 类继承体系中的属性与方法。无论是访问子类特有的属性,还是处理重写父类方法的情况,Reflect
都提供了强大的工具来实现这些操作。