/interface

Interface simulation for ES2015 (ES6) classes.

Primary LanguageJavaScriptMIT LicenseMIT

interface

Interface simulation for ES2015 (ES6) classes.

Bower

bower install interface

How it works

Import interface library.

import Interface from 'interface';

or

import {Interface} from 'interface';

Create our interface.

const Observable = Interface({
  off(name, callback, context) { 
    // unbind listener
  },
  
  on(name, callback, context) {
    // bind listener
  },
  
  once(name, callback, context) {
    // bind listener once
  },
  
  trigger(name) {
    // trigger listeners bound to a name
  }
});

Use it!

class Model extends Observable() {
  constructor() {
    this.on('change', this.save, this);
  }
  
  fetch() {
    // ajax request to fetch data
  }
  
  save(data) {
    // ajax request to save data
    this.trigger('change');
  }
}

So if you want to extend a class with an interface:

const Renderable = Interface({
  render() {
    // render
  }
}) 

class ViewModel extends Renderable(Model) {}

let myViewModel = new ViewModel();
myViewModel.render(); // it works

Note: If you need to use multiple interfaces as javascript inheritance is based on prototyping and mixins, you should keep in mind last element used around is overriding duplicated methods.

const Runnable = Interface({
  run() {
    console.log('runnable');
    // do some stuff
  }
});

const Threadable = Interface({
  run() {
    console.log('threadable');
    // do some stuff
  }
});

class Process extends Threadable(Runnable()) {}

let process = new Process();
process.run(); // threadable

class Program extends Runnable(Threadable()) {}

let program = new Program();
program.run(); // runnable

I hope this explain better ^^.