hasOwnProperty未定义

问题描述 投票:0回答:1

我正在尝试使用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要求'this'是toString处的函数

我尝试运行测试时出错。

我发现错误发生的地方file,看起来像是

[Object.prototype.hasOwnPropertyundefined

我已经在下面提供了代码的特定部分。

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

javascript ecmascript-6 jestjs babeljs
1个回答
1
投票

经过数小时的调试,我发现了问题。

Babel从以下位置转换下面的代码段

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"),这似乎删除了类似于众所周知的Object属性的变量名。

因此,_get__("hasOwnProperty")undefined,而如果像hasOwnProperty那样正常访问,则它的功能还可以。

因此,解决方法:

我刚刚将hasOwnProperty重命名为hasOwnProp和宾果游戏!有效。

© www.soinside.com 2019 - 2024. All rights reserved.