eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.wwwCo się stało z programowaniem obiektowym w JS?Co się stało z programowaniem obiektowym w JS?
  • 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

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: