Некоторые важные отличия сначала (вы, возможно, уже знаете это, но именно так мы находимся на одной странице).
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
Чтобы ответить на конкретные вопросы:
- Похоже, что вы правильно overridding родную функцию. Хранение копии нативной функции, чтобы вы могли называть ее функцией
base
.
- Из приведенного выше примера вам потребуется либо изменить все экземпляры Date, либо только тот, о котором идет речь.
var date = new Date(); date.done = false;
Date.prototype.done = false;
- Причина
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());
спасибо за объяснения. 'this', в вашем заявлении, ссылается на функцию, пока я хотел получить этот экземпляр (сделанный с 'новым'). Пользователь может создавать несколько классов Date с разными начальными датами. Примечание: мое намерение состояло в том, чтобы делать дальнейший расчет на основе года экземпляра (не только +150). – alsaleem