javascript - Proširenje JS Date koristeći TypeScript, ali ključna riječ "this" ne radi ispravno
Kada koristite donji kod za proširenje JavaScript Date tipa, pri pozivanju novih funkcija pojavljuje se pogreška jer ključna riječ this nije ispravno referencirana, tj. kada pozovem funkciju addHours dobivam sljedeću pogrešku:
Nepohvaćena TypeError: _this.getTime nije funkcija
Kad otklanjam pogreške, vidim da je "this" tipa "object Window"
Ovo je TypeScript kod koji koristim:
declare interface Date {
stdTimezoneOffset: () => number;
dst: () => boolean;
addHours: (h: number) => void;
test: () => void;
}
Date.prototype.stdTimezoneOffset = () => {
var jan = new Date(this.getFullYear(), 0, 1);
var jul = new Date(this.getFullYear(), 6, 1);
return Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset());
};
Date.prototype.dst = () => {
return this.getTimezoneOffset() < this.stdTimezoneOffset();
};
Date.prototype.addHours = (h: number) => {
this.setTime(this.getTime() + (h * 60 * 60 * 1000));
};
i .JS datoteka koja je stvorena izgleda ovako:
var _this = this;
Date.prototype.stdTimezoneOffset = function () {
var jan = new Date(_this.getFullYear(), 0, 1);
var jul = new Date(_this.getFullYear(), 6, 1);
return Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset());
};
Date.prototype.dst = function () {
return _this.getTimezoneOffset() < _this.stdTimezoneOffset();
};
Date.prototype.addHours = function (h) {
_this.setTime(_this.getTime() + (h * 60 * 60 * 1000));
};
Date.prototype.test = function () {
return +_this.getTime();
};
Sada mi se čini da je problem u prvom retku .JS datoteke:
var _this = this;
Ali ne znam kako to popraviti.
Odgovor #1
Koristiš arrow funkcije. Arrow funkcije zatvaraju nad this onog mjesta gdje su definirane, umjesto da im this bude postavljen prema načinu na koji su pozvane; ovo drugo je važno za funkcije prototipa.
Umjesto toga koristite normalne funkcije:
Date.prototype.stdTimezoneOffset = function() {
var jan = new Date(this.getFullYear(), 0, 1);
var jul = new Date(this.getFullYear(), 6, 1);
return Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset());
};
Napomena: Kada nadograđujete ugrađene prototipove, vrlo je dobra ideja stvarati ne-enumerabilna svojstva koristeći defineProperty ili defineProperties. Dakle:
Object.defineProperties(Date.prototype, {
stdTimezoneOffset: {
value: function () {
var jan = new Date(this.getFullYear(), 0, 1);
var jul = new Date(this.getFullYear(), 6, 1);
return Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset());
},
configurable: true,
writable: true
},
dst: {
value: function() {
return this.getTimezoneOffset() < this.stdTimezoneOffset();
},
configurable: true,
writable: true
},
addHours: {
value: function(h: number) {
this.setTime(this.getTime() + (h * 60 * 60 * 1000));
},
configurable: true,
writable: true
}
});
(configurable: true, writable: true je samo zato što je to zadano za ugrađena svojstva na Date.prototype, pa sam dosljedan s njima.)
