如何 "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_oldSetFullYear
是 setFullYear
的本机实现,(幸运的是)已通过违规的 calendar-lib
代码通过变量存储和公开。
原始 post 下方的评论中还有其他非常好的建议 - 例如创建 iFrame 并从那里提取 - 所以如果您遇到类似情况,请务必查看这些建议.
我无法控制或删除的脚本已决定覆盖 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_oldSetFullYear
是 setFullYear
的本机实现,(幸运的是)已通过违规的 calendar-lib
代码通过变量存储和公开。
原始 post 下方的评论中还有其他非常好的建议 - 例如创建 iFrame 并从那里提取 - 所以如果您遇到类似情况,请务必查看这些建议.