• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Javascript - this is not a Date object

Object Storage Arubacloud
+1 głos
134 wizyt
pytanie zadane 28 lipca 2020 w JavaScript przez kingkushlee Gaduła (3,960 p.)
zamknięte 28 lipca 2020 przez kingkushlee

Witam, mam taką roboczą funkcję:

function translateDate(unixTimestamp) {
	var date = new Date(unixTimestamp);
	return date.getHours;
}

jednak po wywołaniu jej

//jakis string
     .replace("{SEND_DATE}", translateDate(obj[key].send_date * 1000))

otrzymuję błąd:

Uncaught TypeError: this is not a Date object.
    at getHours (<anonymous>)
    at String.replace (<anonymous>)
    at Object.success (main.js:52)
    at c (jquery-3.5.1.min.js:2)
    at Object.fireWith [as resolveWith] (jquery-3.5.1.min.js:2)
    at l (jquery-3.5.1.min.js:2)
    at XMLHttpRequest.<anonymous> (jquery-3.5.1.min.js:2)

Co się dzieje i jak to naprawić? Dodam, że jeśli zamienię funkcję na zwrócenie całej daty

function translateDate(unixTimestamp) {
	var date = new Date(unixTimestamp);
	return date;
}

to wszystko działa bez zarzutu.

Z góry dziękuję za pomoc

komentarz zamknięcia: Rozwiązano
1
komentarz 28 lipca 2020 przez Paweł Nąckiewicz Nałogowiec (48,990 p.)
Co to znaczy wszystko działa bez zarzutu, co tam jest dokładnie zwracane?

2 odpowiedzi

0 głosów
odpowiedź 28 lipca 2020 przez ScriptyChris Mędrzec (190,190 p.)
wybrane 28 lipca 2020 przez kingkushlee
 
Najlepsza

Błąd "Uncaught TypeError: this is not a Date object.", pojawia się, ponieważ metoda getHours wg specyfikacji jest wykonywana w kontekście (this) obiektu Date - a w pierwszym fragmencie kodu OP tak się nie dzieje. Poniżej analogiczna sytuacja:

var date = new Date();
var gh = date.getHours;
console.log(gh()); // TypeError

W momencie przypisania metody date.getHours do zmiennej, która jest potem wołana jako samodzielna funkcja, this nie wskazuje już na obiekt date.

Więcej o takiej sytuacji można poczytać tutaj: https://javascript.info/reference-type


Problem można rozwiązać zwracając zbindowaną metodę date.getHours:

function translateDate(unixTimestamp) {
    var date = new Date(unixTimestamp);
    return date.getHours.bind(date);
}
komentarz 28 lipca 2020 przez ScriptyChris Mędrzec (190,190 p.)

Małe sprostowanie do:

W momencie przypisania metody date.getHours do zmiennej, która jest potem wołana jako samodzielna funkcja, this nie wskazuje już na obiekt date.

W momencie wywołania zmiennej gh jako samodzielnej funkcji, jej this nie wskazuje już na obiekt date - tak jak to jest w przypadku wywołania date.getHours.

Kontekst this jest automatycznie ustawiany w momencie wywołania funkcji, a nie przypisywania jej referencji do zmiennej.

0 głosów
odpowiedź 28 lipca 2020 przez Paweł Nąckiewicz Nałogowiec (48,990 p.)

Błąd jaki tu widze to powinieneś zwracać rezultat funkcji a nie funkcje (date.getHours()), ale nie wiem czy to jest rozwiązanie problemu

function translateDate(unixTimestamp) {
    var date = new Date(unixTimestamp);
    return date.getHours();
}

 

Podobne pytania

0 głosów
1 odpowiedź 163 wizyt
pytanie zadane 6 kwietnia 2022 w JavaScript przez chrystian Gaduła (4,780 p.)
0 głosów
0 odpowiedzi 42 wizyt
pytanie zadane 28 listopada 2022 w JavaScript przez new_user Użytkownik (610 p.)
0 głosów
1 odpowiedź 439 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...