EcmaScript6 OOP

Classical Inheritence

Object Oriented Programming

the basics

Why OOP?

  • Organize your code in meaningful ways
  • Easier to conceptualize how code relates
  • promotes DRY principle
    • through multiple instances
    • through inheritence
  • promotes encapsulation
    • through access modifiers  
    • by exposing a defined interface

Objects

  • holds state through properties (variables)
  • can perform actions through methods (functions)
  • can have constructor methods which are functions that are invoked when the object is instantiated
  • can have accessor methods that provide public access to private properties

Classes

Classes define the properties and methods that it's instances have.

Classes are not to be treated like objects, instead think of them like blueprints for how objects are structured and behave.

Objects

Are the instances of classes.

All objects constructed from a class share the same properties and methods, while individual object property values may differ.

Classes

defining

  • have a name
  • can extend another class
  • can define a constructor method
  • can define properties
  • can define methods
  • can define accessor methods
    • getters and setters

Classes

have a name

class Rocket {
  
}

Classes

can define a constructor method

class Rocket {
  constructor( model, destination ){
    
  }
}

Classes

can define properties

fuel is a public properties

_launchCount, _model and _destination are private

class Rocket {

  fuel = 100;
  _launchCount = 0;

  constructor( model, destination ){
    this._model = model;
    this._destination = destination;
  }
}

Classes

can define accessor methods
(getters and setters) to access private properties

class Rocket {

  fuel = 100;
  _launchCount = 0;

  constructor( model, destination ){
    this._model = model;
    this._destination = destination;
  }

  get model(){
    return `Rocket Model: ${this._model}`;
  }

  set model( model ){
    if( typeof(model) === 'string' ){
      this._model = model;
    }else{
      throw new TypeError('Rocket.model must be a string');
    }
  }
}

Classes

can define accessor methods
(getters and setters) to access private properties

class Rocket {

  fuel = 100;
  _launchCount = 0;

  constructor( model, destination ){
    this._model = model;
    this._destination = destination;
  }

  get launchCount(){
    return _launchCount;
  }

  set launchCount( launchCount ){
    if( typeof(launchCount) === 'number' ){
      this._launchCount = launchCount;
    }else{
      throw new TypeError('Rocket.launchCount must be a number');
    }
  }
}

Classes

can define methods

class Rocket {

  fuel = 100;
  _launchCount = 0;

  constructor( model, destination ){
    this._model = model;
    this._destination = destination;
  }

  launch(){
    this._launchCount++;
    console.log('to the moon');
  }

}

Class Inheritence

  • extend superclass properties and methods
  • defines it's own constructor method
    • must invoke it's superclass constructor
      before using the `this` keyword
  • can override inherited methods

Define a Superclass

class Vehicle {
  constructor( destination ){
    this._destination = destination;
  }
  
  get destination(){
    return this._destination;
  }
  set destination( destination ){
    if( typeof(destination) === 'string' ){
      this._destination = destination;
    }else{
      throw new TypeError('Vehicle.destination must be a string');
    }
  }
}

Extend the Superclass

class Rocket extends Vehicle{
  
  constructor( model, destination ){
    super( destination );
    this._model = model;
  }

}

// Vehicle is not defined

Import the Superclass definition

import Vehicle from './Vehicle';

class Rocket extends Vehicle{
  
  constructor( model, destination ){
    super( destination );
    this._model = model;
  }

}

Creating Objects

Instances of Classes

  • use the new keyword to create an instance

  • the constructor method is invoked on creation

    • constructor arguments can be passed in

new Rocket('Raccoon', 'The Moon');
  • Classes cannot be invoked like normal functions

Rocket('Raccoon', 'The Moon');
// Cannot call a class as a function

Instance Properties

  • assign the instance to a variable

  • use dot notation or bracket notation to access properties

var raccoon = new Rocket('Raccoon', 'The Moon');
raccoon.fuel;
raccoon['fuel'];

Accessor Methods

  • access properties through getter and setter methods as if they normal are properties

var raccoon = new Rocket('Raccoon', 'The Moon');
raccoon.model; // 'Rocket Type: Raccoon'
raccoon.model = 'Lunar Raccoon';
raccoon['model']; // 'Rocket Type: Lunar Raccoon'
raccoon['model'] = 404; // Rocket.model must be a string
  • assigning a new property to an object will implicitly invoke it's set accessor method 

Instance Methods

  • invoke instance methods normally

  • use dot notation or bracket notation

var raccoon = new Rocket('Raccoon', 'The Moon');
raccoon.launch(); // 'to the moon'
raccoon['launch'](); // 'to the moon'

Inherited properties and methods

from the superclass

var raccoon = new Rocket('Raccoon','The Moon');
raccoon.destination; // The Moon
raccoon.destination = 404; // Vehicle.destination must be a string

Checking Instance Type

  • use instanceof

var raccoon = new Rocket('Raccoon', 'The Moon');
raccoon instanceof( Rocket )  // true
raccoon instanceof Rocket     // true
raccoon instanceof( Vehicle ) // true
raccoon instanceof Vehicle    // true

OOP in ES6

By Jon Borgonia

OOP in ES6

ES6 OOP

  • 2,402