Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 29.09.2019
Сообщений: 1

Подскажите новичку в понимании ООП!

29.09.2019, 22:17. Показов 2351. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток! Я только начинаю изучать java script. Недавно начала знакомится с ООП и у меня возникло много вопросов.
Собственно ближе к делу! Есть такая задача:

Нужно написать классы (конструкторы объектов). Код из примера должен вывести в консоль true.

Описание классов
.
Класс Product. Содержит минимальную информацию о товаре:
- свойство id: любое число (идентификатор товара);
- свойство price: любое число (цена товара);
- метод setPrice(price): устанавливает новую цену и возвращает товар;
- метод withDiscount(percent): возвращает новый экземпляр товара с дополнительным свойством discountedPrice, в котором рассчитана стоимость товара с учетом указанной скидки.

Класс Shop. Содержит товары и функции управления:
- свойство products
- метод addProducts(products)
- метод getProduct(id)

А вот и пример для проверки классов, который и должен вывести в консоль - true.
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var products = [
  {
    "id":3,
    "name":"Cake",
    "price":333,
    "description":"The tastiest cake in the world."
  },
  {
    "id":5,
    "name":"Petroleum",
    "price":2977,
    "description":"Black gold."
  },
  {
    "id":8,
    "name":"Moscow metro logo",
    "price":117000000,
    "description":"Remove circle from logo"
  }
];
 
var shop = new Shop();
shop.addProducts(products);
 
console.log(shop.getProduct(5).setPrice(3224).withDiscount(10).discountedPrice === 2901.6) ;
Я нашла решение на просторах интернета, но, к сожалению, не до конца понимаю как все работает
Я наставила комменты с тем, как я понимаю, что происходит в коде... Поправьте меня, где неправа! И подробнее опишите простыми словами, что происходит в коде. Заранее огромное спасибо!

Вот код решения с моими комментами. Код работает вроде бы верно, но я не до конца понимаю как



JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
class Product {      // Создаем класс Product
    constructor(){         // У него есть два поля в конструкторе - id товара и его цена
        this.id = 0;         // По дефолту id = 0, цена = 0  
        this.price = 0;           
    }
 
    setPrice(price){ // Метод setPrice, насколько поняла setter для нашей цены, который и получает необходимую цену для текущего экземпляра 
        this.price = price; // Собственно присваиваем нашему текущему экземпляру цену переданную в setter параметром   
        return this;  // Возращает текущий экземпляр с уже записанной в него ценой через setter
    }
 
    withDiscount(percent){  // Метод, который принимает параметром скидку
        this.discountedPrice = this.price - (this.price * (percent * 0.01)); // создает в нашем экземпляре новое поле с ценой со скидкой
        return this; // Возвращает текущий экземпляр товара с добавленным в него полем - цена со скидкой 
    }
 
}
 
class Shop extends Product{ // класс Shop который наследует все от класса Product 
    constructor(){ // конструктор 
        super()         //насколько понимаю это обращение к родительскому классу Product? 
        new Product;  // и внутри конструктора идет создание нового экземпляра класса Product? не понимаю зачем????  
        this.products; // просто поле products? Насколько понимаю в него будут записываться продукты
    }
    addProducts (products){  // метод, который просто принимает массив с продуктами и собственно его же и возвращает 
        return products     
    }
 
    getProduct (id){            // метод, который по id, переданному в качестве параметра, выдает продукт с указанным id 
        let arrayProducts = products; // из глобальной области видимости вытягиваем массив с продуктами и присваиваем их переменной arrayProducts 
        for(let i = 0; i < arrayProducts.length; i++){  //перебираем массив в поиске подходящего id   
            if(arrayProducts[i].id === id){
                this.products = arrayProducts[i];
                return this   
            }
        }
    }
}
 
 
var products = [   // массив product, в котором 3 объекта, а непосредственно наши продукты, которые надо добавить в магазин. И кстати, почему названия полей записаны в кавычках?!
  {
    "id":3,
    "name":"Cake",
    "price":333,
    "description":"The tastiest cake in the world."
  },
  {
    "id":5,
    "name":"Petroleum",
    "price":2977,
    "description":"Black gold."
  },
  {
    "id":8,
    "name":"Moscow metro logo",
    "price":117000000,
    "description":"Remove circle from logo"
  }
];
 
var shop = new Shop();  // создаем экземпляр класса Shop
shop.addProducts(products); // куда возвращается products? получается он записывается новым полем в текущий экземляр нашего магазина??? 
 
console.log(shop.getProduct(5).setPrice(3224).withDiscount(10).discountedPrice === 2901.6) /*Выбираем продукт с id - 5, потом присваиваем ему цену 3224, и узнаем цену со скидкой в 10%, после проверяем равна ли эта цена со скидкой 2901.6 
В итоге выдает в консоль true. Значит наши классы написаны правильно, но только не очень понимаю логику кода!!! Объясните кому нетрудно подробно каждую строчку кода! пожалуйста!!!!!*/
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.09.2019, 22:17
Ответы с готовыми решениями:

Подскажите новичку с меню
Добрый день. Подскажите новичку, как лучше сделать выдвижное меню. Хочу сделать чтобы при нажатии на кнопку, меню выдвигалось в лево, а...

Подскажите новичку как разобраться с ссылками
Есть такая строка: &lt;a href=&quot;javascript://&quot;&gt;Ссылка1&lt;/a&gt; Их несколько. При нажатии на такую ссылку появляется определенный текст. Так...

Создание меню (небольшая анимация), подскажите новичку
Доброго времени суток, уважаемые форумчане! Недавно начал изучать JS и сейчас при попытке создать меню столкнулся с нехваткой знаний в...

1
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
30.09.2019, 12:19
Лучший ответ Сообщение было отмечено KseniyaR12 как решение

Решение

KseniyaR12, здравствуйте.
Предыдущий скрипт на выброс.

Смысл задачи точнее раскрыт примерно в таком скрипте:
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
</head>
<body>
    <script>
        class Product {
            /**
             * Устанавливает новую цену и возвращает товар.
             * @param {Number} price Новая цена товара.
             * @returns {Product} этот же товар с измененной ценой.
             */
            setPrice(price) {
                this.price = price;
                return this;
            }
            /**
             * Устанавливает новую цену со скидкой и возвращает товар.
             * @param {Number} percent Скидка от исходной цены, процентов.
             * @returns {Product} этот же товар с измененным свойством discountedPrice.
             */
            withDiscount(percent) {
                this.discountedPrice = this.price * (100 - percent) / 100;
                return this;
            }
        }
 
        class Shop {
            /**
             * Копирует последовательность товаров в свойство products.
             * @param {IterableIterator<Product>} products Последовательность товаров.
             */
            addProducts(products) {
                // Массив лучше копировать в свойство, чтобы не зависеть от исходного массива.
                // При этом изменения свойств товара в исходном массиве всё равно
                // приведут к соответствующему изменению свойств товара в новом массиве.
                this.products = Array.from(products);
            }
            /**
             * Возвращает товар с указанным идентификатором.
             * @param {Number} id Идентификатор товара.
             * @returns {Product} Товар с указанным идентификатором.
             */
            getProduct(id) {
                return this.products.find(e => e.id === id);
            };
        }
 
        var products = [
            {
                "id": 3,
                "name": "Cake",
                "price": 333,
                "description": "The tastiest cake in the world."
            },
            {
                "id": 5,
                "name": "Petroleum",
                "price": 2977,
                "description": "Black gold."
            },
            {
                "id": 8,
                "name": "Moscow metro logo",
                "price": 117000000,
                "description": "Remove circle from logo"
            }
        ];
 
        // Так как в массиве были экземпляры анонимного типа, 
        // подменим им прототип, чтобы они превратились в экземпляры класса Product
        for (var product of products) // Для каждого элемента в массиве экземпляров анонимного типа
            Object.setPrototypeOf(product, Product.prototype); // Превратить в экземпляр Product
 
        var shop = new Shop();
        shop.addProducts(products);
 
        // Здесь избыточно длинная строка, очень трудная для понимания.
        // Из магазина взять продукт с номером 5,
        // установить ему цену 3224 и вернуть продукт, чтобы можно было продолжать писать методы и свойства через точку.
        // Установить ему скидку 10% и вернуть продукт, чтобы можно было продолжать писать методы и свойства через точку.
        console.log(shop.getProduct(5).setPrice(3224).withDiscount(10).discountedPrice === 2901.6);
    </script>
</body>
</html>
Добавлено через 16 минут
---
Вот ещё пара вариантов решения, где анонимные объекты превращаются в экземпляры класса Product не снаружи, а внутри магазина:
Разбираюсь с ООП в js

Разные решения имеют свои исходные условия.
Например, исходная последовательность товаров это строго массив или любая итерируемая последовательность?
От этого зависит, будут ли у последовательности методы массива.

Добавлено через 30 минут
--------
Кстати, в условии задачи discountedPrice не входит в перечень свойств товара, а потом начинает входить в перечень свойств товара?

И не указана природа свойства discountedPrice - это поле или геттер?
Условие задачи порождает двусмысленность и непонимание, куда бежать.

Добавлено через 2 часа 49 минут
-------
Цитата Сообщение от KseniyaR12 Посмотреть сообщение
И кстати, почему названия полей записаны в кавычках?!
В JavaScript так тоже можно. В JS название свойства является строковым индексом. Кстати, напоминает синтаксис имени в SQL - там тоже имя с пробелом можно обрамить квадратными скобками и прокатит.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.09.2019, 12:19
Помогаю со студенческими работами здесь

Чудеса в моём понимании(
До последнего не хотел создавать тему, но в моей голове это уже не укладывается. Сделал я проверку ввода(не без помощи местных форумчан...

Какие игры помогут в понимании JavaScript?
Доброго времени суток форуму! Я учусь front end разработке в IT школе, мне 28 лет. На прошлой неделе случилось так что пришлось...

Трудности в понимании ООП. Необходимо разобраться в скрипте
Имеется такой скрипт. Строчка номер &quot;192&quot; выводит в браузер определенную информацию. &quot;$this-&gt;item&quot; - по видимому объект...

Проблема в понимании ООП(абстрактные классы, классы интерфейсы)
Всем здравия. Читал в свое время разные книги(к примеру, Гради Буч по проектированию) вроде все было понятно. Но тут с толкнулся с...

Новичку с ООП, как можно отличить обьеты
constructor Pole1.Create(width:String;Height:String;corrdinataTop:string;corrdinataLeft:String;Parent: TWinControl;clear:Boolean); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru