我正在尝试使用lodash-es包。因为它是一个ES6模块,所以Babel将其转换为Jest。
Babel配置是:
{
"env": {
"test": {
"plugins": [
"babel-plugin-rewire",
"@babel/plugin-transform-modules-commonjs",
"@babel/plugin-transform-runtime"
],
"ignore": [
"i18n/*.js"
]
}
}
}但我一直在
Function.prototype.toString要求“这”是toString的一个函数
当我试图运行测试时出错。
我找到了文件,从哪里来的错误,这似乎是
Object.prototype.hasOwnProperty是undefined。
我已经包含了下面代码的具体部分。
var funcProto = Function.prototype, objectProto = Object.prototype;
var funcToString = funcProto.toString;
var hasOwnProperty = objectProto.hasOwnProperty;
var reIsNative = RegExp('^' +
// here hasOwnProperty is undefined leading to the error
funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
.replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
);这是个奇怪的错误。我试着在Object.prototype.hasOwnProperty中运行node,它运行得很好。在这种情况下,我试图弄清楚它是如何评估到undefined的。
发布于 2020-06-03 10:30:45
经过多次调试,我发现了这个问题。
将下面的代码片段转换为
var funcProto = Function.prototype, objectProto = Object.prototype;
var funcToString = funcProto.toString;
var hasOwnProperty = objectProto.hasOwnProperty;
var reIsNative = RegExp('^' +
// here hasOwnProperty is undefined leading to the error
funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
.replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
);已转到以下各部分:
var funcProto = Function.prototype, objectProto = Object.prototype;
var funcToString = _get__("funcProto").toString;
var hasOwnProperty = _get__("objectProto").hasOwnProperty;
var reIsNative = RegExp('^' + _get__("funcToString").call(_get__("hasOwnProperty")).replace(_get__("reRegExpChar"), '\\$&').replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$');罪魁祸首是Babel如何引用其变量,但更重要的是,Lodash是如何以属性命名其变量的。
变量hasOwnProperty被引用为_get__("hasOwnProperty"),它似乎删除了类似于众所周知的对象属性的变量名。
所以,_get__("hasOwnProperty")是undefined,但是,如果它是正常访问的,就像hasOwnProperty一样,它具有良好的功能。
所以,修复::
我刚把hasOwnProperty改名为hasOwnProp和宾果!啊,真灵。
https://stackoverflow.com/questions/62166209
复制相似问题