core-js/babel-polyfill polyfilled 函数显示为 [native code]
core-js/babel-polyfill polyfilled functions appear as [native code]
使用 core-js
填充的函数(例如,babel-polyfill
)显示为原生函数。
Promise.race.toString()
产生:
function race() {
[native code]
}
Object.values.toString()
也是如此。
虽然它们肯定不是浏览器的本机实现。例子是Babel REPL页。
开发人员如何以编程方式检查函数不是本机实现而是模仿本机函数的 polyfill(例如,当已知特定的 polyfill 可能会导致应用程序出现问题时)?
通常 native code
regexp 有帮助,但肯定不是这样。
如何从这些函数中检索源代码?我主要对 Node.js 感兴趣,但欢迎使用跨平台解决方案。
这个技巧究竟是怎么做到的?我在 core-js
和 babel-polyfill
源代码中找不到 native code
搜索。
core-js
尝试通过将 Function.prototype.toString
here 替换为默认版本,但允许 core-js如果需要,可以通过在 fn[SRC]
.
处设置一个值来覆盖字符串值
您可以在该文件 here 中进一步查看它分配 fn[SRC]
,特别是
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] }
您在输出中看到的。
Polyfilled core-js
函数有 unique property which is defined by the library 并在内部存储,如 Symbol(src)_1.g50a4eqv8s8xgvi
。这允许图书馆识别它们并伪造 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;
}
使用 core-js
填充的函数(例如,babel-polyfill
)显示为原生函数。
Promise.race.toString()
产生:
function race() {
[native code]
}
Object.values.toString()
也是如此。
虽然它们肯定不是浏览器的本机实现。例子是Babel REPL页。
开发人员如何以编程方式检查函数不是本机实现而是模仿本机函数的 polyfill(例如,当已知特定的 polyfill 可能会导致应用程序出现问题时)?
通常 native code
regexp 有帮助,但肯定不是这样。
如何从这些函数中检索源代码?我主要对 Node.js 感兴趣,但欢迎使用跨平台解决方案。
这个技巧究竟是怎么做到的?我在 core-js
和 babel-polyfill
源代码中找不到 native code
搜索。
core-js
尝试通过将 Function.prototype.toString
here 替换为默认版本,但允许 core-js如果需要,可以通过在 fn[SRC]
.
您可以在该文件 here 中进一步查看它分配 fn[SRC]
,特别是
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] }
您在输出中看到的。
Polyfilled core-js
函数有 unique property which is defined by the library 并在内部存储,如 Symbol(src)_1.g50a4eqv8s8xgvi
。这允许图书馆识别它们并伪造 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;
}