MST
星途 面试题库

面试题:JavaScript反射API在类继承场景下的应用

假设有一个类继承体系,父类和子类都有各自的属性和方法。请阐述如何利用JavaScript反射API来动态访问和操作这些继承体系中的属性与方法,包括访问子类特有的属性、重写父类方法时的相关反射操作等,并通过代码示例说明。
20.6万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

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 都提供了强大的工具来实现这些操作。