-
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
- 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
- TypeScript - jak uzyskać zmienne prywatne? Gdzie korzyści z TS?
Najnowsze wątki
- 2024-05-02 Fotowoltaika - inwerter - jakie ficzery?
- 2024-05-01 1902 Clement Gerrard
- 2024-05-01 Białystok => Inżynier DevOps (Kubernetes, AWS) <=
- 2024-05-01 Berlin => IT Network Engineer <=
- 2024-05-01 Poznań => Java Developer <=
- 2024-05-01 Wrocław => AI Specialist <=
- 2024-05-01 Bieruń => Administrator i wdrożeniowiec Lotus Notes/Domino <=
- 2024-05-01 Kraków => Senior Rust Software Engineer <=
- 2024-05-01 Gdańsk => Senior PHP Developer (Symfony) <=
- 2024-05-01 Trzecia płeć 2
- 2024-05-01 Lublin => Java Full Stack Developer (AI area projects) <=
- 2024-05-01 Lublin => Java Full Stack Developer (projekty w obszarze AI) <=
- 2024-05-01 twardy dysk stuka
- 2024-04-30 Oclenie alkalicznych akumulatorów
- 2024-04-30 Zniknął dźwięk na tylnym panelu