• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Funkcja w obiekcie która używa innej funkcji z obiektu? | JS |

42 Warsaw Coding Academy
0 głosów
514 wizyt
pytanie zadane 19 stycznia 2019 w JavaScript przez Zdolny Bywalec (2,600 p.)

Cześć, mam obiekt z kilkoma funkcjami i w uproszczeniu chcę zrobić coś takiego:

const obj={
    add: (a)=> {
        a+2
    },
    log: (a)=> {
        console.log(add(a))
    }
}
obj.log(5) // spodziewany output: 7

Ktoś ma jakiś pomysł? Chciałbym to zachować w jednym obiekcie

 

1 odpowiedź

+1 głos
odpowiedź 19 stycznia 2019 przez Milesq Nałogowiec (32,020 p.)
wybrane 19 stycznia 2019 przez Zdolny
 
Najlepsza
const obj={
    add: a => { // kiedy jest jeden argument nie trzeba dawać nawiasów
        return a+2; // a kiedy jest jedno wyrażenie które zwracamy możemy usunąć nawiasy klamrowe i tedy wygląda to tak 'add: a => a + 2'
    },
    log: function(a) {
        console.log(this.add(a))
    }
}
obj.log(5)

3 zmiany:

1) this odwołuje się do obiektu

2) funkcja nie strzałkowa, strzałkowe zmieniają kontekst 'this'

3) zwracanie sumy w metodzie add

komentarz 19 stycznia 2019 przez Zdolny Bywalec (2,600 p.)
Dzięki za odpowiedz :)

Jeszcze takie pytanko żeby nie zakładać nowego tematu.

Czy używanie na przemian funkcji strzałkowych  ze zwykłymi w zależności od potrzeb (this) jest normalną praktyką? Wszędzie słyszę ze function jest "be" i żeby tylko używać ()=>, robię tak ale nie do końca wiem dlaczego skoro w takich sytuacjach się przydaje :(
komentarz 20 stycznia 2019 przez Milesq Nałogowiec (32,020 p.)
Czasem używa się function,  nikt nie powinien za to krytykować, tak jak wspominałem funkcja strzałkowa zmienia znaczenie this
komentarz 20 stycznia 2019 przez ScriptyChris Mędrzec (190,190 p.)
edycja 20 stycznia 2019 przez ScriptyChris

tak jak wspominałem funkcja strzałkowa zmienia znaczenie this

Nie. Funkcja strzałkowa korzysta z this z najbliższego scope'u leksykalnego, w którym została utworzona - zatem "sama z siebie" nie zmienia this. Nie możliwa jest też jego zmiana choćby przez bind/call/apply. Poza tym funkcja strzałkowa nie posiada property prototype i nie możliwe jest jej wywołanie w formie konstruktora za pomocą słówka new, co - sumując te "niedogodności" - uniemożliwia tworzenie obiektów z równoczesnym podpięciem do nich prototypu.

Natomiast "zwykła" funkcja ustawia this w zależności od jej sposobu wywołania - więc tutaj bardziej pasuje określenie "dynamicznego this".

Z tego względu nie zaleca się stosowania funkcji strzałkowych jako metod (a przynajmniej nie wtedy, gdy potrzebujesz this ustawionego na obiekt, w kontekście którego wołasz metodę). Natomiast, jeśli potrzebujesz użyć skróconego zapisu dla metody, to jak najbardziej możesz.

Do poczytania:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions#Arrow_functions_used_as_methods

https://wesbos.com/arrow-function-no-no/ (punkt #2: Object Methods)

http://2ality.com/2012/04/arrow-functions.html (akapit 5. Method definitions)

Podobne pytania

0 głosów
1 odpowiedź 334 wizyt
pytanie zadane 26 sierpnia 2018 w JavaScript przez MrxCI Dyskutant (8,260 p.)
0 głosów
1 odpowiedź 276 wizyt
pytanie zadane 15 września 2020 w JavaScript przez Marak123 Stary wyjadacz (11,190 p.)
0 głosów
2 odpowiedzi 794 wizyt

93,385 zapytań

142,384 odpowiedzi

322,540 komentarzy

62,745 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...