面试题答案
一键面试兼容性问题
- 旧版本浏览器支持缺失:在较旧版本的 Chrome、Firefox 和 Safari 中,JavaScript 反射 API 可能完全不被支持。例如,IE 浏览器根本不支持反射 API。即使在 Chrome 51 之前的版本、Firefox 45 之前的版本以及 Safari 10 之前的版本,对反射 API 的支持也不完善。
- 部分方法实现差异:不同浏览器对反射 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
创建一个以 newTarget
或 target.prototype
为原型的新对象,然后使用 target.apply
调用目标函数,并将新创建的对象作为 this
上下文传入,模拟 Reflect.construct
的行为。