Javascript 如何";重置";重写的原型方法返回其原始行为
我无法控制或删除的脚本决定重写Javascript 如何";重置";重写的原型方法返回其原始行为,javascript,date,prototype,jira,Javascript,Date,Prototype,Jira,我无法控制或删除的脚本决定重写Date.prototype.setFullYear方法的默认行为。这会导致代码严重依赖的几个库出现问题,例如date fns 是否有办法将Date.prototype.setFullYear功能“重置”回其原始行为?不管修改原型的脚本在之后是否工作,我不需要它工作,我只是无法轻松删除它 更新: 导致问题的脚本是Jira Core 7.13.3平台上捆绑的众多脚本之一,可加载到所有页面。它名为日历库,在平台上开发插件时会出现问题 由于日历库是基本Jira安装的一部分
Date.prototype.setFullYear
方法的默认行为。这会导致代码严重依赖的几个库出现问题,例如date fns
是否有办法将Date.prototype.setFullYear
功能“重置”回其原始行为?不管修改原型的脚本在之后是否工作,我不需要它工作,我只是无法轻松删除它
更新:
导致问题的脚本是Jira Core 7.13.3平台上捆绑的众多脚本之一,可加载到所有页面。它名为日历库
,在平台上开发插件时会出现问题
由于日历库
是基本Jira安装的一部分,我们无法控制加载顺序;据我所知,有问题的脚本总是先加载
正如@Jonas所建议的,本机方法存储在一个名为Date.prototype.\uuu msh\u oldSetFullYear
的变量中,该变量可能可以使用@Haseeb的答案重置全局行为
更新17.06.19:
Jira开发团队现已确认该问题:
解决方案:
正如@Jonas和@Rob在评论中指出的,在我们的应用程序的起点上设置以下语句解决了问题:
Date.prototype.setFullYear = Date.prototype.__msh_oldSetFullYear;
Date.prototype.setFullYear=Date.prototype.\uu msh\u oldSetFullYear代码>
其中,Date.prototype.\uuu msh\u oldSetFullYear
是本机实现(幸运的是)由有问题的日历库
存储和公开
下面的评论中有很多非常好的建议,所以如果你遇到类似的情况,一定要查看这些建议
谢谢 以下是您可以做的
选项1-这将全局覆盖该功能
let obj = new Date();
obj.__proto__.setFullYear = function(){
//your override code goes in here.
}
选项2-这将仅覆盖本地范围内的方法,或仅覆盖实例化对象的范围内的方法
let obj = new Date();
obj.setFullYear = function(){
//your override code goes in here
}
希望这对您有用。正如@Jonas和@Rob在原始问题的评论中指出的,在我们的应用程序的起点上设置以下语句解决了问题:
Date.prototype.setFullYear = Date.prototype.__msh_oldSetFullYear;
其中,Date.prototype.\uuu msh\u oldSetFullYear
是setFullYear
的本机实现,幸运的是,它通过变量存储并由有问题的calendar lib
代码公开
在原始帖子下面的评论中也有其他非常好的建议,比如创建一个iFrame并从中提取它,所以如果你遇到类似的情况,一定要查看这些建议。不,如果它丢失一次,就不能重新构建。覆盖它的部分必须保留对原始方法的引用,可能它也会公开它?在加载有问题的脚本之前,您可以运行自己的脚本吗?您可以从另一个领域(通常是iframe)带回内置方法,但实际上,您应该首先防止该脚本与它们发生冲突。如果Jira正在破坏内置程序,请对其进行错误报告。您是否可以控制何时加载/导入有问题的脚本?关于这一内容的一些上下文可能会引发一些想法。如果您最后的陈述是正确的,您可以简单地执行Date.prototype.setFullYear=Date.prototype.\uu msh\u oldSetFullYear
。这可能会对使用calendar-lib的任何内容产生副作用。请参阅关于\uuuuu proto\uuuuu
的使用,强烈建议不要使用。访问对象的[[Prototype]]
有(最近的)符合标准的方法。虽然这不是一个任何人都想使用的解决方案,但这可能需要重置函数行为。不过,唯一的缺点是必须手动复制原始功能。谢谢你的提示,我将结合上面的注释尝试一下。@TormodHaugene如果你想“重置”这个方法,你可以使用Date.prototype,而不是使用日期实例的非标准属性。请注意,这可能会对使用日历库的任何内容产生副作用。