CODE PAGE
OOP Code
This is ES6 code. In ES5, JavaScript used functions as classes. Now, JavaScript has a class, super, etc. keywords for more traditional OOP.
BASIC
Here is a basic class with a constructor that gets called first. It receives two parameters that get stored as public properties. There is a method called sum() that adds these. We did not need to make a class to do this - just showing the format.
class MyClass { constructor(a=1, b=2) { // parameters with default values this.a = a; // make a property this.b = b; } sum() { // make a method return this.a + this.b; } } const myObject = new MyClass(20); // create object from class const total = myObject.sum(); console.log(total, myObject.a); // 22 20 // A second object can have its own sum. // Each object is called an instance of the class and has its own properties const myObject2 = new MyClass(50, 50); const total2 = myObject2.sum(); // 100
// VERSION 2 - methods in constructor class MyClass { constructor(a=1, b=2) { // parameters with default values // the keyword this refers to the object made // so the sum function will be stored on the object as a method // this is handy as we have access to the parameters here // and that keeps the values of a and b private this.sum = () => { // make a method return a + b; } } } const myObject = new MyClass(20); // create object from class const total = myObject.sum(); console.log(total, myObject.a); // 22 undefined
// VERSION 3 - private properties const MyClass { #a; #b; // declare private properties constructor(a=1, b=2) { // parameters with default values this.#a = a; // assign parameter to private property this.#b = b; } sum() { // make a method return this.#a + this.#b; } } const myObject = new MyClass(20); // create object from class const total = myObject.sum(); console.log(total, myObject.a); // 22 undefined
INHERITANCE
Here is an example of inheritance where the Sub class extends (inherits) from Base class. Other sub classes can be made that have different additions.
class Base { constructor () {this.public = "hello";} publicMethod() {console.log("wow");} } class Sub extends Base { super(); // call the super class constructor () {this.public2 = "world";} publicMethod2() {console.log("now");} } const obj = new Sub(); // create object from Sub class that extends Base class console.log(obj.public + " " + obj.public2); // hello world obj.publicMethod(); // wow obj.publicMethod2(); // now
OVERRIDE
Here the sub class has a method called the same as the base class. This is called overriding. We can access the base method using the super keyword that refers to the super class. This way, sub classes can act differently if desired.
class Base { constructor () {this.public = "hello";} publicMethod() {console.log("wow");} } class Sub extends Base { super(); // call the super class constructor () {this.public2 = "world";} publicMethod() { // overrides Base publicMethod console.log("like"); super.publicMethod(); // calls Base's version using super } } const obj = new Sub(); // create object from Sub class that extends Base class obj.publicMethod(); // like wow
GETTER SETTER
Getter and Setter methods are accessed like a property but run functions. It is very common to want to provide a convenient property on the outside but do a series of steps on the inside. Perhaps we want to convert a property value or constrain it to a range. Maybe we have to move things around when a property is set. Here we demonstrate a private property. This is one that can be used across the methods, but it is not directly available to the outside.
class MyClass { #x; // declare a private property - only for inside the class constructor() { this.#x = 0; // set the private property } get x() { return this.#x; // return our private value } set x(value) { // must have one parameter this.#x = Math.max(0, value); // make sure x >= 0 } } const obj = new MyClass(); obj.x = -15; // this calls the set method which runs the boundary check console.log(obj.x); // 0 as returned by the get method
STATIC
Use the static keyword to store properties or methods right on class. Like Math.random() is a static method of the Math class.
class Cake { static num = 0; // property that belongs to class constructor() { Cake.num++; } static getPrice() { return Cake.num * 20; } } new Cake(); new Cake(); // make two cakes console.log(Cake.getPrice()); // call static method (40) console.log(Cake.num); // or access static property (2)