Declarei um método de extensão para objetos criando minha própria função. No entanto, não o chamo ou importo em lugar nenhum. Como resultado, recebo uma exceção. Como posso consertar isso? Não me lembro de tal comportamento no VUE 2.
Object.prototype.mergeObjXXXX = function(obj2){
console.log(this);
console.log(obj2);
}
vue 3.5.13 vue-roteador: 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
É totalmente esperado que modificar protótipos de objetos incorporados possa causar problemas em algum momento. Tem sido uma prática ruim por mais de uma década por bons motivos e marcada como um problema sério por analisadores de código.
A menor coisa que pode ser feita para reduzir a possibilidade de problemas é tornar
mergeObjXXXX
não enumeráveis:Isso resulta em uma propriedade não enumerável, não gravável e configurável
mergeObjXXXX
, e corresponde a outros descritores de métodos de protótipo.Não se sabe qual é a causa exata neste caso, mas isso pode ser uma correção aqui porque o erro potencialmente resulta do roteador Vue iterando propriedades enumeráveis com
in
o operador , o que também não é uma boa prática. Uma maneira correta de fazer isso desse lado seria iterar suas próprias propriedades comObject.keys
em vez disso, porque essa é a intenção. Que um pedaço de código faça algo que não está previsto em outro pedaço de código é o problema exato com a poluição de protótipos de objetos e a modificação de globais para propósitos locais em geral .A correção adequada seria refatorar as ocorrências de
obj.mergeObjXXXX(obj2)
tomyHelpers.mergeObjXXXX(obj, obj2)
, isso pode ser feito com uma simples substituição de regex para toda a base de código. Simplesmente não há uma boa justificativa para isso hoje em dia.