Poznajemy short-circuiting w JavaScript – sposób na wywoływanie funkcji przy użyciu operatorów logicznych. Nie jest to tylko „sztuczka” czy jakaś ciekawostka, ale coś, co bywa realnie wykorzystywane – szczególnie w frameworku React.
W JavaScript (oraz wielu innych językach programowania) istnieje sposób wywoływania dwóch (lub więcej) funkcji w taki sposób, że wywoływana jest pierwsza i tylko wtedy, gdy zwróci ona wartość prawdziwą, wywoływana jest następna.
I tym sposobem nie jest tworzenie bloków warunkowych if-else (to znaczy – możemy je tworzyć i w ten sposób osiągnąć ten efekt) ale wspomniany w tytule short circuit evaluation.
Przykład użycia
Na początku stworzymy funkcję konstruktora dla obiektów Person:
<script>
function Person(name, age) {
this.name = name;
this.age = age;
this.drunk = false;
}
</script>
Podajemy imię i wiek, dostajemy obiekt Person z takim imieniem i wiekiem oraz wartością drunk (pijany) ustawioną na false.
Teraz dodajemy funkcje get_drunk i is_adult. Dodajemy je do prototypu Person:
Person.prototype.getDrunk = function(){
this.drunk = true;
}
Person.prototype.isAdult = function() {
return this.age >= 18;
}
Dodajemy do prototypu a nie do obiektu, ponieważ wtedy te funkcje istnieją 1 raz, w prototypie, zamiast istnieć w każdym obiekcie Person.
Każdy obiekt Person ma swoje name, age i drunk, ale funkcje getDrunk i isAdult są takie same dla każdego obiektu i nie ma sensu tworzyć ich w funkcji konstruktora, dodajemy do prototypu – funkcje istnieją tylko raz.
Teraz pora stworzyć kilka obiektów Person:
let john = new Person("John", 30);
let bob = new Person("Bob", 13);
I teraz tak: wywołajmy sobie na tych obiektach getDrunk, ale tylko wtedy, gdy isAdult zwraca prawdę. Służy do tego operator logiczny „&&” (and) pomiędzy wywoływanymi funkcjami:
john.isAdult() && john.getDrunk();
console.log(john.drunk);
//true
Jako że John jest dorosły (isAdult zwraca true) funkcja getDrunk się wywołuje.
Teraz Bob:
bob.isAdult() && bob.getDrunk();
console.log(bob.drunk);
//false
Bob ma 13 lat. To mniej niż 18. Funkcja po lewej (isAdult) zwraca false, a co za tym idzie, funkcja po prawej nie jest wykonywana, co widzimy w console.logu.
I tak to działa. Wystarczy znaleźć do tego triku dobre zastosowania (tego rodzaju sposób wywoływania funkcji często jest spotykany na przykład w frameworku React).
Do następnego razu!