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

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

29.09.2019, 22:17. Показов 2401. Ответов 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
6497 / 3908 / 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
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru