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

ES6 rozszerzanie metod

Konferencja JOIN! 2018
0 głosów
109 wizyt
pytanie zadane 6 kwietnia w JavaScript, jQuery, AJAX przez dziedziu Początkujący (370 p.)

Siemanko, mam zadanie o takiej treści:

5. Stwórz klasę „samochód”, która będzie dziedziczyć po klasie „pojazd”:

a. Klasa powinna dziedziczyć wszystkie właściwości.

b. Dodaj metodę wyświetlającą tekst: Samochód jest niezniszczalny, bo ma kolor [wartość z właściwości Kolor], jeśli kolor auta to czerwony.

c. Rozszerz metodę generującą stan licznika; metoda powinna dodawać dowolną liczbę przekazaną do metody.

I niestety nie wiem jak rozwiązać punkt c tego zadanka. Nie znalazłem w necie przykładu pozwalającego mi rozwiązać ten problem. Tutaj treść zadania do stworzenia metod generowania stanu licznika:

2. Do klasy „pojazd” dodać metodę, która będzie:

a. generować liczbę z zakresu 1 000 - 10 000.

b. Wylosowana liczba powinna być podzielna przez 100.

c. Metoda powinna zwracać wartość tylko w przypadku gdy wylosowana wartość jest większa niż 2 500. W innym przypadku zwraca wartość: Silnik jest niedotarty.

d. Niezależnie od wylosowanej wartości przypisz ją do właściwości stan licznika.

3. Dodaj metodę, która wyświetli wartość: Stan licznika to: [wylosowana liczba] km.

Poniżej kod:

class pojazd
{
    constructor(type,color,engine)
    {
        this.type=type;
        this.color=color;
        this.engine=engine;
        this.status=0;
    }
    showType()
    {
        return `Pojazd typu: ${this.type}`;
    }
    showColor() 
    {
        return `Pojazd koloru: ${this.color}`;
    }
    showEngine() 
    {
        if (engine=='elektryczny')
        {
            return `${this.engine} jest ekologiczny`;
        }
        else if (engine=='benzynowy'||engine=='diesel')
        {
            return `${this.engine} jest nie-ekologiczny. Elon Musk nie jest
            zadowolony z Twojego wyboru.`;
        }
    }
    counter()
    {
        let value = Math.floor(Math.random()*(90+1)+10)*100;
        if (value>2500)
        {
            this.status=value;
            return value;
        }
        else
        {
            this.status=value;
            return 'Silnik jest niedotarty'
        }
    }
    statusValue()
    {
        return `Stan licznika to: ${this.status} km.`;
    }
    interfejs()
    {
        let pojazd_div = document.createElement('div');
        let paragraph = document.createElement('p');
        pojazd_div.appendChild(paragraph);
        let textnode = document.createTextNode(this.showType());
        paragraph.appendChild(textnode);
        pojazd_div.classList.add(this.type);
        document.querySelector('body').appendChild(pojazd_div);
    }
}

class samochod extends pojazd
{
    constructor(color, engine, added)
    {
        super('samochód',color, engine);
        this.status=status;
    } 
    counter(added)
    {
     //?
    }
    indestructible()
    {
        if (this.color==='czerwony')
        {
            return `Samochód jest niezniszczalny, bo ma kolor ${this.color}`;
        }
    }
}

const pojazd1 = new pojazd('samochód','zielony','diesel');

const samochod1 = new samochod('czerwony', 'diesel', 3);





Jakieś pomysły?

Pozdrawiam!

1 odpowiedź

0 głosów
odpowiedź 7 kwietnia przez elwood Bywalec (2,860 p.)
Nie wiem czy ze mną coś nie tak, czy co, ale ja treści tych "Waszych" zadań zupełnie nie rozumiem :) Jak dla mnie dziwacznie opisane i rozszerzanie tej metody to jakaś głupota, ale do rzeczy.

Jeżeli chcesz rozszerzyć jakąś metodę najpierw przypisz do zmiennej metodę jego rodzica. W tym wypadku wygląda to mniej więcej tak:

const superCounter = pojazd.prototype.counter;

Teraz w metodzie counter w clasie samochod należy wywołać metodę call bądź apply na naszej zmiennej superCounter

superCounter.call(this);

potem można to zapisać np tak:

this.status = this.status + added;

i znów sprawdzić warunek czy jest większe od 2500.

Tak jak pisałem na początku, nie jestem pewien w jaki sposób powinno być to rozwiązane. Przyjąłem tutaj, że nie modyfikujemy w żaden sposób classy rodzica.

Plus z tego taki, że przynajmniej teraz będziesz wiedział jak rozszerzyć metody, wiec dalej sobie na pewno poradzisz :)
1
komentarz 7 kwietnia przez Comandeer Mentor (432,330 p.)

Można tak, ale to strasznie ES5. W ES6 wystarczy ponownie zadeklarować tę metodę w klasie potomnej i wywołać super.oryginalnaMetoda.

komentarz 7 kwietnia przez elwood Bywalec (2,860 p.)
Nie wiedziałem. Zaraz sobie Sprawdzę :) dzięki

edit: faktycznie :) super sprawa.

Podobne pytania

0 głosów
2 odpowiedzi 141 wizyt
pytanie zadane 24 listopada 2017 w JavaScript, jQuery, AJAX przez goran. Użytkownik (900 p.)
+2 głosów
1 odpowiedź 183 wizyt
pytanie zadane 29 listopada 2017 w JavaScript, jQuery, AJAX przez UltraSF Stary wyjadacz (10,700 p.)
0 głosów
2 odpowiedzi 106 wizyt
Porady nie od parady
Forum posiada swój własny chat IRC, dzięki któremu będziesz mógł po prostu pogadać z innymi Pasjonatami lub zapytać o jakiś problem. Podstrona z chatem znajduje się w menu pod ikoną człowieka w dymku.IRC

55,269 zapytań

99,579 odpowiedzi

204,900 komentarzy

27,239 pasjonatów

Przeglądających: 158
Pasjonatów: 1 Gości: 157

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...