2013-04-14 3 views
2

jQuery Виджет Datepicker основан на встроенной дате. Я пытаюсь переопределить Дату, чтобы вычислить наш собственный календарь, который отличается годом, месяцем .... (без необходимости менять код датпикера). Я попробовал приведенный ниже код для тестирования, но это переопределение вызывается дважды.Функция js override вызывается дважды

Date.prototype.getFullYear = (function(){ 
    var $gfy = Date.prototype.getFullYear; 
    if (!this.done) { 
     this.done = true; // add my own variable to this instance 
     return function() { 
      return $gfy.call(this)+150; 
     }; 
    } else { 
     return function() { 
      return $gfy.call(this); 
     }; 
    } 
}()); 

Так,

  1. , что это правильный путь, чтобы переопределить встроенные функции и

  2. как добавить переменную в исходный экземпляр.

  3. как получить сам экземпляр (здесь это не работает).

ответ

1

Некоторые важные отличия сначала (вы, возможно, уже знаете это, но именно так мы находимся на одной странице).

prototype изменяет поведение всех объектов (экземпляров и будущих экземпляров). Поэтому при изменении типов встроенных типов (Date, String и т. Д.) Легко пройдите, так как вы будете изменять поведение этих объектов для каждой используемой ими процедуры.

Live Demo

//Add a property to the instance 
var date = new Date(); 
date.newProp = 'test'; 
alert(date.newProp); //test 

//----VS---- 

//Add a property to all instances existing 
//and too be created 
Date.prototype.newProp2 = 'new prop'; 

var date2 = new Date(); 
alert(date2.newProp);//undefined 
alert(date2.newProp2); //new prop 

//See how the prototype modified the existing instance as well. 
alert(date.newProp2); //new prop 

Чтобы ответить на конкретные вопросы:

  1. Похоже, что вы правильно overridding родную функцию. Хранение копии нативной функции, чтобы вы могли называть ее функцией base.
  2. Из приведенного выше примера вам потребуется либо изменить все экземпляры Date, либо только тот, о котором идет речь.
    • var date = new Date(); date.done = false;
    • Date.prototype.done = false;
  3. Причина this не работает в вашей внешней функции, потому что это self executing anonymous function и сразу же выполняется для того, чтобы назначить одну из своих внутренних функций метода getFullYear ,

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

Live Demo

//Add a variable to all Date objects 
Date.prototype.done = false; 

//Override the getFullYear function 
Date.prototype.getFullYear = (function(){ 

    //Store a reference to the native function 
    var $gfy = Date.prototype.getFullYear; 
    return function(){ 

     //Have we hit this routine before? 
     if (!this.done) { 

      //We've hit this routine once so flag it. 
      this.done = true; 

      //Execute native funciton, then add 150 
      return $gfy.call(this)+150; 
     } else { 

      //Call the native function from now on. 
      return $gfy.call(this); 
     } 
    } 
}());//self executing function so it executes as soon as it is evaluated. 

var date = new Date(); 

//Will return +150 the first time 
alert(date.getFullYear()); 

//After that execute the default 
//function for'getFullYear' 
alert(date.getFullYear()); 
+0

спасибо за объяснения. 'this', в вашем заявлении, ссылается на функцию, пока я хотел получить этот экземпляр (сделанный с 'новым'). Пользователь может создавать несколько классов Date с разными начальными датами. Примечание: мое намерение состояло в том, чтобы делать дальнейший расчет на основе года экземпляра (не только +150). – alsaleem

Смежные вопросы