Classes: blauwdrukken voor objecten¶
Doel¶
Je leert hoe je met classes meerdere objecten kunt maken zonder steeds dezelfde code te herhalen. Een class is een blauwdruk voor objecten die allemaal dezelfde structuur en gedrag delen.
1. Het probleem: copy-paste objecten¶
In de vorige les maakte je meerdere objecten met dezelfde eigenschappen en functies.
let ball1 = { x: 50, y: 100, speed: 2, color: 'red', move() { this.x += this.speed; }, show() { fill(this.color); circle(this.x, this.y, 20); } };
let ball2 = { x: 100, y: 130, speed: 1.5, color: 'blue', move() { this.x += this.speed; }, show() { fill(this.color); circle(this.x, this.y, 20); } };
Dat werkt, maar is niet handig. Als je iets wilt aanpassen (zoals de manier waarop een bal beweegt), moet je alle objecten handmatig bijwerken.
Denkvraag
Wat zou er gebeuren als je 50 ballen had?
2. De oplossing: een class als blauwdruk¶
Met een class beschrijf je één keer hoe een bepaald type object eruitziet en zich gedraagt.
class Ball {
constructor(x, y, speed, color) {
this.x = x;
this.y = y;
this.speed = speed;
this.color = color;
}
move() {
this.x += this.speed;
if (this.x > width || this.x < 0) {
this.speed *= -1;
}
}
show() {
fill(this.color);
circle(this.x, this.y, 20);
}
}
De class zelf maakt nog niets zichtbaar. Je moet eerst objecten aanmaken met het sleutelwoord new:
En dan roep je hun functies aan:
Tip
De constructor() is een functie die wordt automatisch uitgevoerd als je new Ball(...) gebruikt.
Classes in meerdere bestanden
Je kunt classes in meerdere bestanden plaatsen. Dit is handig als je je code in je project wilt opsplitsen en zo overzichtelijker te maken. Zorg dat je de classes in de juiste volgorde in je HTML-bestand aanroept.
Als je de class Ball nodig hebt in het programma sketch.js, dan moet je eerst de class Ball in het bestand ball.js inladen in je HTML-bestand.
3. Veel objecten tegelijk beheren¶
Gebruik een array om veel objecten tegelijk aan te maken:
let balls = [];
function setup() {
createCanvas(400, 200);
for (let i = 0; i < 10; i++) {
let ballColor = color(random(255), random(255), random(255));
balls.push(new Ball(random(width), random(height), random(1, 3), ballColor));
}
}
function draw() {
background(220);
for (let oneBall of balls) {
oneBall.move();
oneBall.show();
}
}
Mini-opdracht
- Voeg een
bounce()functie toe die zorgt dat de bal stuitert tegen de randen. - Voeg een
changeColor()functie toe die de kleur verandert bij elke botsing.
4. Eigenschappen uitbreiden¶
Je kunt de class aanpassen om meer gedrag toe te voegen zonder andere code aan te raken.
class Ball {
constructor(x, y, speed, color, radius) {
this.x = x;
this.y = y;
this.speed = speed;
this.color = color;
this.radius = radius;
}
move() {
this.x += this.speed;
if (this.x > width - this.radius || this.x < this.radius) {
this.speed *= -1;
}
}
show() {
fill(this.color);
circle(this.x, this.y, this.radius * 2);
}
}
Nu kun je eenvoudig ballen met verschillende groottes maken:
Denkvraag
Waarom is het handiger om de radius in de class op te slaan in plaats van in een losse variabele?
5. Vooruitblik: overerving (inheritance)¶
Soms wil je dat een class voortbouwt op een andere class. Bijvoorbeeld: je hebt gewone ballen, maar je wilt er één die beweegt met zwaartekracht.
class GravityBall extends Ball {
constructor(x, y, speed, color, radius, gravity) {
super(x, y, speed, color, radius);
this.gravity = gravity;
}
move() {
this.y += this.gravity;
super.move(); // gebruik de move() van Ball
}
}
Nu kun je gewone en speciale ballen combineren:
Mini-opdracht:
Maak een GravityBall en een gewone Ball en laat ze samen op het canvas bewegen. Wat merk je op?
Tip
extends betekent dat een class de eigenschappen en functies van een andere class overneemt. Zo kun je logica hergebruiken en uitbreiden.
6. Vergelijking: object vs. class vs. inheritance¶
| Aspect | Object | Class | Subclass (Inheritance) |
|---|---|---|---|
| Structuur | EΓ©n specifiek ding | Blauwdruk voor meerdere dingen | Breidt een andere class uit |
| Hergebruik | Slecht (copy-paste) | Goed | Uitstekend (gedrag overnemen) |
| Aanmaak | Handmatig | Met new |
Met new (inclusief parent-functies) |
7. Reflectie¶
Met classes:
- Schrijf je minder herhalende code.
- Kun je makkelijk veel objecten beheren.
- Kun je gedrag uitbreiden met inheritance.
Mini-opdracht:
Gebruik een Ball- en GravityBall-class in één animatie. Laat de ene stuiteren en de andere vallen.
Begrippen¶
- Class: blauwdruk voor objecten met dezelfde structuur en gedrag.
- Constructor: speciale functie binnen een class die startwaarden instelt.
- Instance: concreet object dat gemaakt is met
new. - Method: functie die bij een class hoort.
- Encapsulatie: samenbrengen van data en gedrag binnen een logische eenheid.
- Inheritance (overerving): een class kan voortbouwen op een andere class en zo gedrag overnemen en uitbreiden.