MST

星途 面试题库

面试题:JavaScript 中反射 API 的基础兼容性问题

请描述在常见浏览器环境(如 Chrome、Firefox、Safari)中,JavaScript 反射 API(如 Reflect.construct 等)可能存在的兼容性问题,并举例说明如何使用垫片(polyfill)来解决其中一个方法的兼容性。
12.2万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

兼容性问题

  1. 旧版本浏览器支持缺失:在较旧版本的 Chrome、Firefox 和 Safari 中,JavaScript 反射 API 可能完全不被支持。例如,IE 浏览器根本不支持反射 API。即使在 Chrome 51 之前的版本、Firefox 45 之前的版本以及 Safari 10 之前的版本,对反射 API 的支持也不完善。
  2. 部分方法实现差异:不同浏览器对反射 API 某些方法的实现细节可能存在差异。比如 Reflect.construct 在参数处理、原型链构建等方面,不同浏览器可能有细微差别,虽然这种情况相对较少,但仍可能导致代码在不同浏览器下行为不一致。

以 Reflect.construct 为例的垫片实现

if (!Reflect.construct) {
    Reflect.construct = function(target, argumentsList, newTarget) {
        if (typeof target!== 'function') {
            throw new TypeError('Target must be a function');
        }
        let proto = newTarget || target.prototype;
        let obj = Object.create(proto);
        return target.apply(obj, argumentsList);
    };
}

上述代码首先检查 Reflect.construct 是否存在,如果不存在则进行模拟实现。它通过 Object.create 创建一个以 newTargettarget.prototype 为原型的新对象,然后使用 target.apply 调用目标函数,并将新创建的对象作为 this 上下文传入,模拟 Reflect.construct 的行为。