Wat is een klasse?
Een klasse is een container die de eigenschappen en methoden van objecten beschrijft van een bepaald type. Uit een klasse worden objecten gecreëerd. We zeggen dat een object een instantie is van een bepaalde klasse.
Implementeer een klasse Circle die de eigenschap radius bezit en de methode draw bezit. De methode print enkel het woord ‘draw’ in de conole.
class Circle {
constructor(radius) {
this.radius = radius;
}
draw() {
console.log(‘draw’);
}
}
const c = new Circle(5);
Worden klassen gehoist?
Klassen worden niet gehoist. Het is dus niet mogelijk om ze te gebruiken voor hun definitie.
Klassen kunnen twee soorten methoden hebben: static methods en instance methods.
Statische methoden zijn niet beschikbaar op een instantie van een klasse maar zijn beschikbaar op de klasse zelf. Dit wilt ook zeggen dat, wanneer je de inhoud van een object in de console bekijkt, dat je geen statische methoden zal waarnemen.
class Circle {
static totalCircles = 0;
constructor(radius) {
Circle.totalCircles++;
this.radius = radius;
}
static someMethod() {
//do some
}
}
Op welke twee manieren kan je private leden definiëren? Implementeer voor elk van beiden een voorbeeld.
Er zijn twee manieren om private leden te definiëren:
1. Door gebruik te maken van Symbols
2. Door gebruik te maken van WeakMaps
Voorbeeld 1: private members met symbols:
const _radius = Symbol();
const _draw = Symbol();
class Circle {
constructor(radius) {
this[_radius] = radius;
}
_draw {
console.log(“I’m a circle”);
}
}
Voorbeeld 2: Private members met weakMaps:
const _radius = new WeakMap();
const _move = new WeakMap();
class Circle {
constructor(radius) {
_radius.set(this, radius);
_move.set(this, function () {
console.log('move: ', this);
}); }draw() {
console.log(‘radius: ‘ + _radius.get(this));
_move.get(this).call(this);
}
}
OF:
const _privateMembers = new WeakMap();
class Circle {
constructor(radius) {
_privateMembers.set(this, {
radius,
move: function () {
console.log(‘move: ‘, this);
},
});
}
draw() {
console.log(‘radius: ‘ + _privateMembers.get(this).radius);
_privateMembers.get(this).move.call(this);
}
}
Wat is het nadeel van het definiëren van private members als Symbols?
Het nadeel is dat er wel een manier bestaat om toch toegang te krijgen tot de private data. DIt kan dan als volgt:
// c is een object dat private members bevat
const symbols = Object.getOwnPropertySymbols(c);
const firstPrivateMember = symbols[0];
console.log(c[firstPrivateMember]);
Wat kan je zeggen over klassen en strict mode?
De body van klassen wordt automatisch uitgevoerd in strict mode.
Hoe definieer je getters en setters in klassen?
Door gewoonweg de set en get keywords voor de methode te plaatsen.
Hoe kan je ervoor zorgen dat een klasse B de leden van klasse A overerft?
Doorgebruik te maken van het extends keyword:
class B extends A {
//…
}
Stel dat klasse B overerft van klasse A:
class Shape {
constructor(color) {
this.color = color;
}
}
class Circle extends Shape {
constructor(radius, color) {
super(color);
this.radius = radius;
}
}
Het is belangrijk dat de super call gebeurt alvorens de andere eigenschappen in de constructor worden geïnitialiseerd.
class Shape {
move() {
console.log(“move”);
}
}
class Circle extends Shape {
move() {
// move methode van superklasse wordt opgeroepen
super.move();
console.log(“circle move”);
}
}