使用core-js (例如,babel-polyfill)多填充的函数显示为本机函数。
Promise.race.toString()产生:
function race() {
[native code]
}Object.values.toString()也是如此。
虽然它们肯定不是浏览器的原生实现。Babel REPL页面就是一个例子。
开发人员如何以编程方式检查函数不是本机实现,而是模仿本机函数的polyfill (例如,当已知某个特定的polyfill可能会导致应用程序出现问题时)?
通常情况下,native code正则表达式会有所帮助,但情况肯定不是这样。
如何从这样的函数中检索源代码?我主要对Node.js感兴趣,但是跨平台的解决方案是受欢迎的。
这个把戏到底是怎么做到的?我在core-js和babel-polyfill源代码中找不到用于native code搜索的任何内容。
发布于 2017-02-06 08:52:32
core-js试图通过将Function.prototype.toString here替换为使用默认值的版本来使其多填充功能看起来像是本地实现的,但允许core-js-js通过在fn[SRC]处设置值来覆盖字符串值。
您可以在更远的位置看到它分配fn[SRC]的文件here,特别是
if(isFunction)has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));如果在本例中检查TPL,则它是["function ", "() { [native code] }"],因此当使用.join(String(key))调用时,您将以
function race() { [native code] }您在输出中看到的。
发布于 2017-02-07 02:39:24
与Symbol(src)_1.g50a4eqv8s8xgvi一样,多重填充的core-js函数具有unique property which is defined by the library并在内部存储。这允许库识别它们并伪造toString()结果(正如另一个答案所详细解释的那样)。
有可能检测到唯一属性并欺骗core-js揭示真正的函数体:
function getPolyfillUid(fn) {
return Object.getOwnPropertyNames(fn).find(prop => /^Symbol\(.+\)_/.test(prop))
}
function toTrueString(fn) {
const uid = getPolyfillUid(fn);
let fnString;
if (uid) {
const uidDescriptor = Object.getOwnPropertyDescriptor(fn, uid);
delete fn[uid];
fnString = fn.toString();
Object.defineProperty(fn, uid, uidDescriptor);
} else {
fnString = fn.toString();
}
return fnString;
}https://stackoverflow.com/questions/42058945
复制相似问题