Passa al contenuto principale

Shopping Cart

Anteprima del progetto Shopping Cart – pagina principale Anteprima del progetto Shopping Cart – pagina finale

Il Progetto

Shopping cart interattivo sviluppato con programmazione orientata agli oggetti in JavaScript. Un'applicazione che dimostra l'uso delle classi ES6, la gestione dello stato e la manipolazione del DOM per creare un sistema di e-commerce funzionale.

Codice Sorgente

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>freeCodeCamp Shopping Cart</title>
<link rel="stylesheet" href="./styles.css" />
</head>
<body>
<header>
<h1 class="title">Desserts Page</h1>
</header>
<main>
<button id="cart-btn" type="button" class="btn">
<span id="show-hide-cart">Show</span> Cart
</button>
<div id="cart-container">
<button class="btn" id="clear-cart-btn">Clear Cart</button>
<div id="products-container"></div>
<p>Total number of items: <span id="total-items">0</span></p>
<p>Subtotal: <span id="subtotal">$0</span></p>
<p>Taxes: <span id="taxes">$0</span></p>
<p>Total: <span id="total">$0</span></p>
</div>
<div id="dessert-card-container"></div>
</main>
<script src="./script.js"></script>
</body>
</html>

La Scoperta: Le Classi Sono "Zucchero Sintattico"

È stato un progetto molto interessante, soprattutto comprendere cosa c'è "sotto il cofano" delle classi in JavaScript.

JavaScript, di fatto, non ha classi nel senso tradizionale dei linguaggi come Java o C++. Quando scriviamo:

class ShoppingCart {
constructor() {
this.items = [];
this.total = 0;
}
addItem(product) {
this.items.push(product);
}
}

JavaScript lo trasforma automaticamente (senza dartelo a vedere) in questo codice:

function ShoppingCart() {
this.items = [];
this.total = 0;
}
ShoppingCart.prototype.addItem = function(product) {
this.items.push(product);
};

È "zucchero sintattico" (termine coniato dall'informatico inglese Peter J. Landin): rende quindi il codice più dolce da leggere, ma sotto è sempre lo stesso meccanismo basato su funzioni. Nonostante ciò, dopo aver compreso il meccanismo, confrontando i due blocchi di codice è evidente quanto la sintassi delle classi sia decisamente più semplice da leggere e da scrivere. Ho sentito lo stesso "click" delle variabili CSS, ovvero quella sensazione di volerle usare in ogni progetto futuro.

Cosa Ho Imparato

Programmazione Orientata agli Oggetti (OOP):

  • Classi ES6: Sintassi moderna per creare oggetti con proprietà e metodi
  • Constructor: Metodo speciale chiamato automaticamente con new per inizializzare l'istanza
  • Keyword this: Riferimento all'istanza corrente della classe
  • Keyword new: Operatore che crea una nuova istanza, esegue il constructor e restituisce l'oggetto
  • Prototipi: Sistema sottostante alle classi, ogni metodo viene aggiunto a ClassName.prototype

Metodi Array Avanzati:

  • .forEach() per iterare su elementi con side effects
  • .find() per cercare il primo elemento che soddisfa una condizione
  • .reduce() per accumulare valori in un singolo risultato (es. somma prezzi)

Destructuring:

  • Estrazione di proprietà da oggetti: const { name, price } = product
  • Sintassi concisa che evita ripetizioni come product.name, product.price

Operatori JavaScript:

  • Spread Operator (...): Converte HTMLCollection in array per usare metodi array
  • Operatore OR (||): Fornisce valori di default: value || 0
  • Operatore NOT (!): Inverte booleani per pattern toggle
  • Operatore Ternario (? :): Condizioni inline per codice più conciso

Template Literals:

  • Backticks ` per stringhe multi-linea
  • Interpolazione con ${} per inserire variabili
  • Escapare il simbolo $ quando necessario: $${price} (primo $ è letterale)

Gestione Floating Point:

  • Problema: 0.1 + 0.2 !== 0.3 in JavaScript
  • Soluzione: .toFixed(2) per arrotondare + parseFloat() per riconvertire in numero

DOM Manipulation:

  • getElementsByClassName() restituisce HTMLCollection (non array!)
  • innerHTML += per aggiungere elementi dinamicamente
  • style.display per show/hide: "block" vs "none"

Event Handling:

  • event.target.id per identificare l'elemento cliccato
  • .bind(cart) per fissare il contesto this nei callback
  • addEventListener per gestire interazioni utente

Pattern di Stato:

  • Toggle booleano con isCartShowing = !isCartShowing
  • Gestione stato centralizzato nella classe ShoppingCart

Prossimo progetto: Imparare l’Intermediate OOP costruendo un Platformer Game