首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >core-js/babel-polyfill polyfill函数显示为[本机代码]

core-js/babel-polyfill polyfill函数显示为[本机代码]
EN

Stack Overflow用户
提问于 2017-02-06 08:35:32
回答 2查看 927关注 0票数 2

使用core-js (例如,babel-polyfill)多填充的函数显示为本机函数。

Promise.race.toString()产生:

代码语言:javascript
复制
function race() {
    [native code]
}

Object.values.toString()也是如此。

虽然它们肯定不是浏览器的原生实现。Babel REPL页面就是一个例子。

开发人员如何以编程方式检查函数不是本机实现,而是模仿本机函数的polyfill (例如,当已知某个特定的polyfill可能会导致应用程序出现问题时)?

通常情况下,native code正则表达式会有所帮助,但情况肯定不是这样。

如何从这样的函数中检索源代码?我主要对Node.js感兴趣,但是跨平台的解决方案是受欢迎的。

这个把戏到底是怎么做到的?我在core-jsbabel-polyfill源代码中找不到用于native code搜索的任何内容。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-06 08:52:32

core-js试图通过将Function.prototype.toString here替换为使用默认值的版本来使其多填充功能看起来像是本地实现的,但允许core-js-js通过在fn[SRC]处设置值来覆盖字符串值。

您可以在更远的位置看到它分配fn[SRC]的文件here,特别是

代码语言:javascript
复制
if(isFunction)has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));

如果在本例中检查TPL,则它是["function ", "() { [native code] }"],因此当使用.join(String(key))调用时,您将以

代码语言:javascript
复制
function race() { [native code] }

您在输出中看到的。

票数 5
EN

Stack Overflow用户

发布于 2017-02-07 02:39:24

Symbol(src)_1.g50a4eqv8s8xgvi一样,多重填充的core-js函数具有unique property which is defined by the library并在内部存储。这允许库识别它们并伪造toString()结果(正如另一个答案所详细解释的那样)。

有可能检测到唯一属性并欺骗core-js揭示真正的函数体:

代码语言:javascript
复制
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;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42058945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档