eGospodarka.pl

eGospodarka.plGrupypl.comp.www › Co się stało z programowaniem obiektowym w JS?
Ilość wypowiedzi w tym wątku: 2

  • 1. Data: 2018-01-20 16:34:18
    Temat: Co się stało z programowaniem obiektowym w JS?
    Od: Marek S <p...@s...com>

    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


  • 2. Data: 2018-01-20 21:36:17
    Temat: Re: Co się stało z programowaniem obiektowym w JS?
    Od: Marek S <p...@s...com>

    Już mniej więcej wiem o co chodzi. Otóż operator this zachowuje się
    jakby "strict mode" był włączony chociaż nie jest. Dotyczy to wyłącznie
    funkcji wołanej przez inną funkcję w ramach jednego obiektu. Chyba nie
    ma wyjścia i trzeba całość kodu przepisać do wersji "strict" :-(

    --
    Pozdrawiam,
    Marek

strony : [ 1 ]



Szukaj w grupach

Szukaj w grupach

REKLAMA

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:

Strona korzysta z plików cookies w celu realizacji usług i zgodnie z Polityką Prywatności. Możesz określić warunki przechowywania lub dostępu do plików cookies w Twojej przeglądarce.