Który sposób deklaracji właściwości klasy jest poprawny?
class Example1
{
lol = 0;
}
class Example2
{
constructor()
{
this.lol = 0;
}
}
Który sposób deklaracji właściwości klasy jest poprawny?
class Example1
{
lol = 0;
}
class Example2
{
constructor()
{
this.lol = 0;
}
}
Oba sposoby są prawidłowe.
Ten zapis pochodzi z ES6
class Example2
{
constructor()
{
this.lol = 0;
}
}
a to jest jedynie skrót pochodzący z ES7 (bodajże, ale nie jestem pewien w której wersji dokładnie to weszło), ale pod spodem nadal jest to zamienianie na wersje z konstruktorem
class Example1
{
lol = 0;
/*
constructor() {
this.lol = 0;
}
*/
}
Mam taki fragment klasy:
class Lol
{
firstNumber = "";
secondNumber = "";
addComma()
{
if (jakiś warunek)
{
this.puttingComma(this.firstNumber);
}
else
{
this.puttingComma(this.secondNumber);
}
}
puttingComma(number)
{
if (number.includes('.'))
{
number += ".";
}
}
Metoda puttingComma(number) nie robi tego, czego oczekuję. Gdzie jest błąd?
Poczytaj sobie o mutowalności/niezmienności (ang. immutability) w JavaScript.
kosmonauta80 napisał(a):
Mam taki fragment klasy:
class Lol { firstNumber = ""; secondNumber = ""; addComma() { if (jakiś warunek) { this.puttingComma(this.firstNumber); } else { this.puttingComma(this.secondNumber); } } puttingComma(number) { if (number.includes('.')) { number += "."; } }
Metoda puttingComma(number) nie robi tego, czego oczekuję. Gdzie jest błąd?
Wszędzie w nazwach zmiennych masz number, ale to nie są liczby tylko stringi firstNumber = ""
, number += "."
, więc nazewnictwo jest lekko mylące, ale to najmniej istotne.
Metoda puttingComma
działa na razie w taki sposób, że przekazujesz liczbę string, sprawdzasz, czy ma kropkę i jeśli tak to chcesz dodać drugą kropkę.
Powinno być chyba zaprzeczenie if(!number.includes('.'))
, żeby warunek robił to co chcesz, czyli wykrywał brak kropki.
I jeszcze na dole przykład jak zmodyfikować właściwość klasy po przekazaniu wartości do funkcji.
class Test {
foo = 0;
bar = 0;
changeRandomValue() {
if (Math.random() > 0.4) {
this.foo = this.calc(this.foo)
} else {
this.bar = this.calc(this.bar)
}
}
calc(value) {
// nie robimy value = ...
// tylko zwracamy nową wartość przez return
return Math.pow(value, 2) + 1;
}
}
Sprawdzę to popołudniu. Chyba zmęczony byłem :]
Czyli jak rozumiem, poprawnie i bez zastrzeżeń przekazuję referencję do pewnej właściwości klasy, pomiędzy metodami tej samej klasy.
Przy okazji pytanie odnośnie czytelności. Poniżej to samo zapisane na 2 sposoby. Które podejście jest lepsze?
// dłuższy zapis
if (jakiś warunek)
{
this.puttingComma(this.firstNumber);
}
else
{
this.puttingComma(this.secondNumber);
}
// krótszy zapis
(jakiś warunek) ? this.puttingComma(this.firstNumber) : this.puttingComma(this.secondNumber);
kosmonauta80 napisał(a):
Sprawdzę to popołudniu. Chyba zmęczony byłem :]
Czyli jak rozumiem, poprawnie i bez zastrzeżeń przekazuję referencję do pewnej właściwości klasy, pomiędzy metodami tej samej klasy.
Poprawnie przekazujesz, ale nie poprawnie przypisałeś wynik, bo zmieniałeś wartość jedynie w obrębie danej metody. W twoim wypadku powinno być coś takiego
this.firstNumber = this.puttingComma(this.firstNumber)
.
kosmonauta80 napisał(a):
Przy okazji pytanie odnośnie czytelności. Poniżej to samo zapisane na 2 sposoby. Które podejście jest lepsze?
// dłuższy zapis if (jakiś warunek) { this.puttingComma(this.firstNumber); } else { this.puttingComma(this.secondNumber); }
Kwestia preferencji, co kto woli, ale ja zostawiłbym ten zapis z if/else
, albo zamienił na coś takiego
this.puttingComma((jakis_warunek) ? this.firstNumber : this.secondNumber);
Poprawiłem i działa:
this.firstNumber = this.puttingComma(this.firstNumber);
//
puttingComma(number)
{
if (!number.includes('.'))
{
return number += ".";
}
//
Można i tak :)
puttingComma(number)
{
return (number.includes('.') ? (number += ".") : (number);
}