• 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 |

VPS Starter Arubacloud
0 głosów
304 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ź 234 wizyt
pytanie zadane 26 sierpnia 2018 w JavaScript przez MrxCI Dyskutant (8,260 p.)
0 głosów
1 odpowiedź 153 wizyt
pytanie zadane 15 września 2020 w JavaScript przez Marak123 Stary wyjadacz (11,190 p.)
0 głosów
2 odpowiedzi 538 wizyt

92,454 zapytań

141,262 odpowiedzi

319,099 komentarzy

61,854 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...