如何 "reset" 一个被覆盖的原型方法恢复到它原来的行为

How to "reset" an overridden Prototype method back to its original behaviour

我无法控制或删除的脚本已决定覆盖 Date.prototype.setFullYear 方法的默认行为。这会导致我们的代码严重依赖的几个库出现问题 - 例如 date-fns

有什么方法可以 "reset" 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 代码存储和公开。

下面的评论中有很多非常好的建议,所以如果您遇到类似情况,请务必检查一下。

谢谢!

这是您可以执行的操作

选项 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.__msh_oldSetFullYearsetFullYear 的本机实现,(幸运的是)已通过违规的 calendar-lib 代码通过变量存储和公开。

原始 post 下方的评论中还有其他非常好的建议 - 例如创建 iFrame 并从那里提取 - 所以如果您遇到类似情况,请务必查看这些建议.