-
Data: 2018-01-20 16:34:18
Temat: Co się stało z programowaniem obiektowym w JS?
Od: Marek S <p...@s...com> szukaj wiadomości tego autora
[ pokaż wszystkie nagłówki ]Witam,
Kiedyś zrobiłem spory projekt w JS, który jakiś czas temu przestał
działać. Postanowiłem przyjrzeć się sprawie. Okazało się, że styl
programowania "obiektowego" jaki używałem przestał działać. Przykład
poniżej.
Funkcje prywatne (f1, f2) kiedyś definiowało się wewnątrz innej funkcji.
Funkcje mogły się wzajemnie wywoływać zachowując kontekst obiektu
(testClass). Wszystko pięknie działało lata ... i przestało nagle
(sprawdzałem Edge, Firefox).
W poniższym przykładzie kliknięcie przycisków "test" i "test2" powoduje,
że zadziałają funkcje odpowiednio f1 (prywatna) i f3 (publiczna).
Natomiast wywołanie z ich poziomu innej funkcji prywatnej (f2) powoduje,
że traci ona kontekst obiektu (testClass). Jej operator this wskazuje na
obiekt Window!!! Funkcja f2 traktowana jest tak jakby była poza klasą
testClass. Mało tego, analizując inny przypadek, this stał się nawet
"undefined". Zawsze chodzi o to samo: wywołanie jakiejś prywatnej
funkcji w obiekcie z poziomu innej - przestało być możliwe z zachowanie
kontekstu.
Przykład zacznie działać gdy zamiast wywoływać f2(), wywołam
f2.bind(this)().
Co się stało, że powszechnie stosowane metody nagle padły? Czy da się to
jakoś przywrócić do życia bez przerabiania tysięcy linii kodu?
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<script>
var tc;
function testClass()
{
function f2()
{
console.log("f2",this===tc);
}
function f1()
{
console.log("f1",this===tc);
f2();
}
this.f3=function()
{
console.log("f3",this===tc);
f2();
}
document.getElementById("test").addEventListener("cl
ick",f1.bind(this))
}
function init()
{
tc=new testClass();
}
window.addEventListener("load",init);
</script>
</head>
<body>
<button type="button" id="test">test</button>
<button type="button" onClick="tc.f3()">test 2</button>
</body>
</html>
--
Pozdrawiam,
Marek
Następne wpisy z tego wątku
- 20.01.18 21:36 Marek S
Najnowsze wątki z tej grupy
- UWAGA: MAM PODEJRZENIE, ŻE onet.pl DOKONUJE ATAKÓW!!!
- Komisja sejmowa odrzuca petycję ws. obowiązkowych kanałów RSS na stronach podmiotów publicznych
- kol. sukces po polsku: "Samurai Labs. Technologia do zapobiegania samobójstwom"
- Wściekli obywatele spalili budynek parlamentu Nepalu [bo odcięli im amerykańskie serwery społecznościowe - przyp. JMJ]
- UWAGA: MAM PODEJRZENIE, ŻE trojmiasto.pl DOKONUJE ATAKÓW
- Cenzura na wolnemedia.net - likwidacja codziennej sekcji "Sygnały zauważone"
- Nowe style na energokod.pl
- Jak działa hosting w którym wykupuje się sam serwer i domenę, bez IP?
- Perfidne ataki krakerów z KRLD na skrypciarzy JS i Pajton
- Do sądu trafił pozew zbiorowy przeciw Google'owi - oskarżenie o praktyki monopolistyczne na rynku reklamy internetowej
- Jakie znacie działające serwery grup dyskusyjnych?
- is it live this group at news.icm.edu.pl
- php, linki z nazwami a $_GET, SEO
- www polityka pl captcha
- dyktatura brudnego palucha
Najnowsze wątki
- 2025-10-26 Masz 20 sekund na poddanie się :)
- 2025-10-26 automat czy manual
- 2025-10-25 W UK (groźnego) seksualnego przestępce (z Etiopii) aż na JEDEN ROK (rasiści) skazali
- 2025-10-25 Warszawa => Senior Cloud Engineer - AWS <=
- 2025-10-24 Prawdziwy obraz społeczeństwa Gazy.
- 2025-10-24 Atra_ment Canona GI-41 vs 45 itp...
- 2025-10-24 Warszawa => International Freight Forwarder <=
- 2025-10-24 Co może być gorsze od pożaru elektryka?
- 2025-10-24 Co może być gorsze od pożaru elektryka?
- 2025-10-24 Warszawa => Senior Microsoft Dynamics 365 Business Central Consultant
- 2025-10-24 Bieruń => Spedytor Międzynarodowy (handel ładunkami/prowadzenie flo
- 2025-10-23 brylant
- 2025-10-23 Warszawa => BI Developer / Analityk BI <=
- 2025-10-23 Warszawa => Młodszy Specjalista ds. wsparcia sprzedaży <=
- 2025-10-23 Trójmiasto => Head of Social Media <=




Deweloperzy hamują sprzedaż mieszkań, ale nie podnoszą cen