Cls

Simple class abstraction in JavaScript

An interface for classical object oriented programming in JavaScript.

var Slideshow, sshow;
 
Slideshow = Cls({
  methods: {
    constructorfunction(slideseffect) {
      this.slides = slides;
      this.effect = effect;
    },
    goTofunction(slide) {
      domSelector('#id').nextSlide(slide, this.effect);
    }
  },
  statics: {
    version: '0.0.1'
  }
});
 
sshow = new Slideshow(['top_story', 'sport', 'politics'], 'fade');

var MegaSlideshow, mshow;
 
MegaSlideshow = Cls({
  uber: Slideshow,
  methods: {
    goTofunction(slide) {
      var that = this;
 
      this.changePageTitle(slide, function() {
        that.inherited('next');
      });
    }
  }
});

You can override / add methods to a class/object (any object) using Cls.mixin(obj, { /* methods */ }):

var laptop = {
  os: 'OSX Lion',
  processor: 'i5'
};
 
laptop = Cls.mixin(laptop, { memory: '8GB', cores: 5 });

You can use Cls in the browser or in a Node.js app.

<script src="path/to/cls.js"></script>
<!-- Cls() is exposed as a global var -->
 
<script type="text/javascript">
  var Foo = Cls({ ... });
  ...
</script> 

var Cls = require('Cls');
 
var Foo = Cls({ ... });

Install the package with npm manually or by including the app into your package.json dependencies.

$ npm install Cls

// then, in your Node app
var Cls = require('Cls')
$ npm install .
$ npm test
$ npm run-script build

Only edit the file src/cls.js. For more examples check test/tests.js.

  • prototype is a long word
  • People are used to classes from other languages
  • Although CoffeeScript's Class implementation is nice, if you have 10 files that use OOP the __extends function is defined 10 times
  • I don't like the functionality provided by most of the similar OOP libraries or I consider them bloated
log = console.log
Cls = require './cls'
 
Animal = Cls
  methods:
    constructor: (@name) ->
 
    move: (meters) ->
      log "#{@name} moved #{meters} meters"
 
  statics:
    types: ['vertebrates', 'invertebrates']
 
Snake = Cls
  uber: Animal
  methods:
    move: ->
      log "Slithering..."
      setTimeout =>
        this.inherited 'move', [5]
      , 300
 
Horse = Cls
  uber: Animal
  methods:
    move: ->
      log "Galloping..."
      args = arguments
      setTimeout =>
        this.inherited 'move', args
      , 1500
 
sam = new Snake "Sammy the Python"
tom = new Horse "Tommy the Palomino"
 
sam.move()
tom.move(45)