Klasy możemy definiować na dwa sposoby:
// class declaration class Car { constructor(make) { this.make = make; } } var ford = new Car("Ford"); console.log(ford.make); console.log(typeof Car); //function // class expression syntax var Plane = class { constructor(make) { this.make = make; } } var plane = new Plane("Airbus"); console.log(plane.make);
Poza konstruktorami, klasy mogą zawierać regularne funkcja (które zostaną dodane do prototypu obiektu), oraz settery i gettery pozwalające na zaimplementowanie reguł enkapsulacji (jak na przykład w C#). Specjalnym rodzajem metod są metody statyczne - nie zostaną one dodane do prototype, tylko do samej klasy.
class Tank { constructor() { this._name = ""; } get name(){ console.log("getting name"); return this._name; } set name(value){ console.log("setting name"); this._name = value; } fire(){ console.log("fire !"); } static report(){ console.log("reporting !"); } } var abrams = new Tank(); abrams.name = "Abrams"; console.log(abrams.name); abrams.fire(); Tank.report(); console.log(typeof abrams.__proto__.fire); //function console.log(typeof abrams.__proto__.report); //undefined
Klasy niosą za sobą także możliwość dziedziczenia, reprezentowaną przez słowo kluczowe extends. Dziedziczyć można po klasie lub bezpośrednio po konstruktorze. Drugie, nowe słowo kluczowe to super. Służy ono do wywołania konstruktora bazowego oraz do odwołania się do metod z bazowego konstruktora.
function A(a) { this.a = a; } A.prototype.printA = function(){ console.log(this.a); } class B extends A { constructor(a, b) { super(a); this.b = b; } printB() { console.log(this.b); } static sayHello() { console.log("Hello"); } } class C extends B { constructor(a, b, c) { super(a, b); this.c = c; } printC() { console.log(this.c); } printAll() { this.printC(); super.printB(); super.printA(); } } var obj = new C(1, 2, 3); obj.printAll(); C.sayHello();
Brak komentarzy:
Prześlij komentarz