Prototypal Inheritance
Before ES6, inheritance in JavaScript was very complicated compared to other languages:
function Vehicle(options){ this.make = options.make } Vehicle.prototype.drive = function(){ return 'vroom'; } function Car(options){ Vehicle.call(this, options); this.color = options.color; } Car.prototype = Object.create(Vehicle.prototype); Car.prototype.constructor = Car; Car.prototype.honk = function(){ return 'beep'; } const vehicle = new Vehicle({make:'Ford'}); console.log(vehicle.drive()); console.log('----------------------------'); const toyota = new Car({make:'Toyota', color:'red'}); console.log(toyota.drive()); console.log(toyota.honk());
Classes with ES6 Enhanced Object Literal Syntax
The following code produces the same result, but is much cleaner:
class Vehicle{ constructor(options){ this.make = options.make; } drive(){ return 'vroom'; } } const vehicle = new Vehicle({make:'Ford'}); console.log(vehicle); console.log(vehicle.drive()); console.log('------------------------------------------------'); class Car extends Vehicle{ constructor(options){ super(options); this.color = options.color; // 'this' is undefined without call to super() } honk(){ return 'beep'; } } const toyota = new Car({make:'Toyota', color:'red'}); console.log(toyota); console.log(toyota.drive()); console.log(toyota.honk());