JS代码报错Uncaught TypeError: V[a].exec is not a function的修复求助
JS代码报错Uncaught TypeError: V[a].exec is not a function的修复求助
嗨,我来帮你搞定这个报错问题~
你遇到的这个错误,根源在于给Object.prototype添加自定义方法导致的原型污染。JS里几乎所有数据类型(字符串、数组、甚至内置API的对象)都继承自Object.prototype,当你在它上面加了twoDigits方法后,一些内置函数(比如和正则相关的exec方法)在遍历对象属性时,会意外获取到这个自定义方法,从而触发类型错误。
下面给你两种可行的修复方案:
方案1:使用独立工具函数(推荐,完全避免原型污染)
把twoDigits改成独立函数,直接接收数字参数,这样不会影响任何内置原型:
let now = new Date(); // 独立工具函数,处理数字转两位格式 function twoDigits(num) { return ("0" + num).slice(-2); } // 调用函数处理小时和分钟 timeOfDay = twoDigits(now.getHours()) + ':' + twoDigits(now.getMinutes()); // 时间判断逻辑不变 if ('05:01' <= timeOfDay && timeOfDay <= '23:59') { document.getElementById('skryj').style.display = 'none'; }
方案2:给Number原型添加方法(保留链式调用)
因为getHours()和getMinutes()返回的都是数字类型,你可以把方法挂在Number.prototype上,只影响数字对象,不会污染全局原型:
let now = new Date(); // 仅给数字类型扩展方法 Number.prototype.twoDigits = function() { return ("0" + this).slice(-2); } // 链式调用逻辑不变 timeOfDay = now.getHours().twoDigits() + ':' + now.getMinutes().twoDigits(); if ('05:01' <= timeOfDay && timeOfDay <= '23:59') { document.getElementById('skryj').style.display = 'none'; }
两种方案都能解决你的报错问题,个人更推荐第一种,因为原型扩展如果处理不当很容易引发类似的隐性问题,独立函数更安全可控。
备注:内容来源于stack exchange,提问作者viyrag
相关产品推荐
相关产品推荐

