Как «сбросить» переопределенный метод Prototype обратно в исходное поведение - PullRequest
0 голосов
/ 15 июня 2019

Сценарий, который я не могу контролировать или удалить, решил переопределить поведение по умолчанию метода 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 ]

1 голос
/ 15 июня 2019

Вот что вы можете сделать

Опция 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
  }

Надеюсь, это сработает для вас.

0 голосов
/ 17 июня 2019

Как отметили @Jonas и @Rob в комментариях к исходному вопросу, установка следующего утверждения в начальной точке нашего приложения решила проблему:

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

Где Date.prototype.__msh_oldSetFullYear - этонативная реализация setFullYear, которая (к счастью) хранилась и выставлялась через переменную оскорбительным кодом calendar-lib.

В комментариях ниже исходного поста были и другие действительно хорошие предложения - такие как созданиеiFrame и извлекая его оттуда, поэтому обязательно проверьте его, если вы находитесь в аналогичной ситуации.

...