如何将覆盖的原型方法“重置”回其原始行为

时间:2019-06-14 21:16:45

标签: javascript date prototype jira

我无法控制或删除的脚本决定覆盖Date.prototype.setFullYear方法的默认行为。这给我们的代码高度依赖的几个库(例如date-fns)带来了问题。

是否有任何方法可以将Date.prototype.setFullYear函数“重置”回其原始行为?修改原型的脚本最初是否可以工作都没关系-我不需要它,我只是不能轻易地删除它。

更新:

引起问题的脚本是Jira Core 7.13.3平台上捆绑的许多脚本之一,该平台可加载所有页面。它名为calendar-lib,在平台上开发插件时会引起问题。

由于calendar-lib是基本Jira安装的一部分,因此我们无法控制加载顺序;据我所知,有问题的脚本将始终首先加载。

类似于@Jonas的建议,结果表明本机方法存储在名为Date.prototype.__msh_oldSetFullYear的变量中,可以用@Haseeb的答案重置全局行为。

更新17.06.19:

Jira开发人员团队现已确认此问题: https://jira.atlassian.com/browse/JRASERVER-69491

解决方案:

正如@Jonas和@Rob在评论中指出的那样,在我们的应用程序的起点上设置以下语句解决了该问题:

Date.prototype.setFullYear = Date.prototype.__msh_oldSetFullYear;

{幸运的是,Date.prototype.__msh_oldSetFullYear是由有问题的calendar-lib代码存储和公开的本机实现。

下面的评论中有很多非常好的建议,因此如果您处于类似的情况,请务必检查一下。

谢谢!

2 个答案:

答案 0 :(得分:1)

这是您可以做的

选项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
  }

希望这对您有用。

答案 1 :(得分:0)

正如@Jonas和@Rob在原始问题的注释中指出的那样,在我们的应用程序的起点设置以下语句解决了该问题:

Date.prototype.setFullYear = Date.prototype.__msh_oldSetFullYear;

Date.prototype.__msh_oldSetFullYearsetFullYear的本机实现,幸运的是,calendar-lib代码通过有问题的ionic repair存储并通过变量公开。

原始帖子下方的评论中还有其他非常好的建议-例如创建iFrame并从那里提取它-因此,如果您处于类似情况,请务必检查一下。