我通过创建自己的函数为对象声明了一个扩展方法。但是,我没有在任何地方调用或导入它。结果,我得到了一个异常。我该如何解决这个问题?我不记得 VUE 2 中存在这样的行为。
Object.prototype.mergeObjXXXX = function(obj2){
console.log(this);
console.log(obj2);
}
vue 3.5.13 vue-路由器:4.5.0
main.js:38 TypeError: Cannot convert undefined or null to object
at Object.assign (<anonymous>)
at Object.mergeObjXXXX (ext.js:20:9)
at extractComponentsGuards (vue-router.js?v=ea680b7e:1465:32)
at vue-router.js?v=ea680b7e:2484:16
修改内置对象原型在某些时候可能会导致问题,这是完全可以预料到的。十多年来,出于充分的理由,这一直是一种不好的做法,并被代码分析人员标记为严重问题。
为了减少出现问题的可能性,至少可以做一件事,就是让它
mergeObjXXXX
不可枚举:这导致不可枚举、不可写、可配置的
mergeObjXXXX
属性,并对应于其他原型方法描述符。在这种情况下,确切原因尚不清楚,但这可能是一个修复方法,因为错误可能是由Vue 路由器使用
in
运算符迭代可枚举属性引起的,这也不是一个好的做法。从那方面来看,正确的方法是使用迭代自己的属性Object.keys
,因为这是意图。一段代码执行了另一段代码无法预见的事情,这正是污染对象原型和出于本地目的修改全局变量的问题所在。正确的解决方法是将 的出现次数重构为
obj.mergeObjXXXX(obj2)
,myHelpers.mergeObjXXXX(obj, obj2)
这可以通过对整个代码库进行简单的正则表达式替换来实现。目前对此没有很好的理由。