Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
An interface for classical object oriented programming in JavaScript.
JavaScript
Branch: master

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.
src
test
.gitignore
.npmignore
.travis.yml
README.md
cls.js
cls.min.js
package.json

README.md

Cls

An interface for classical object oriented programming in JavaScript. Build Status

API

Creating a class with Cls

var Slideshow, sshow;

Slideshow = Cls({
  methods: {
    constructor: function(slides, effect) {
      this.slides = slides;
      this.effect = effect;
    },
    goTo: function(slide) {
      domSelector('#id').nextSlide(slide, this.effect);
    }
  },
  statics: {
    version: '0.0.1'
  }
});

sshow = new Slideshow(['top_story', 'sport', 'politics'], 'fade');

Extending that class

var MegaSlideshow, mshow;

MegaSlideshow = Cls({
  uber: Slideshow,
  methods: {
    goTo: function(slide) {
      var that = this;

      this.changePageTitle(slide, function() {
        that.inherited('next');
      });
    }
  }
});

Mixins

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 });

Environments

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

In the browser

<script src="path/to/cls.min.js"></script>
<!-- Cls() is exposed as a global var -->

<script type="text/javascript">
  var Foo = Cls({ ... });
  ...
</script>

Node.js

var Cls = require('Cls');

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

Install the Package!

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')

Developers

$ npm install .
$ npm test
$ npm run-script build

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

Why did I write this library?

  • 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

Bonus - for CoffeeScript fans

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)
Something went wrong with that request. Please try again.