-
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
- 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
- www.znanylekarz.pl
- Czy pytanie o sczytywanie stron programami/skryptami to tu?
- Grupy webdevowe
- Jak wydrukować stronę?
- IIS, kilka witryn
- linki <a href="/strona.php"> (ze slashami)
- co rozszerza stronę??
- responsywny akapit <p>
- Czy istnieje jakiś emulator przeglądarek pod Mac'a?
- taka sama konfiguracja dla localhost i produkcji
Najnowsze wątki
- 2024-11-14 Gliwice => Network Systems Administrator (IT Expert) <=
- 2024-11-14 Gliwice => Administrator Systemów Sieciowych (Ekspert IT) <=
- 2024-11-13 Filtr do pompy ruskiej
- 2024-11-12 Gdzie kosz?
- 2024-11-13 elektrycznie
- 2024-11-12 Jebane kurwa, kurwy.
- 2024-11-13 karta parkingowa
- 2024-11-13 Wl/Wyl (On/Off) bialy/niebieski
- 2024-11-12 I3C
- 2024-11-13 Kraków => DevOps Engineer (Junior or Regular level) <=
- 2024-11-13 Łódź => Senior SAP HANA Developer <=
- 2024-11-13 Zabrze => Senior PHP Symfony Developer <=
- 2024-11-13 Karlino => Konsultant wewnętrzny SAP (FI/CO) <=
- 2024-11-13 Kraków => QA Inżynier <=
- 2024-11-13 Żerniki => Dyspozytor Międzynarodowy <=