Skip to content


Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
An interface for classical object oriented programming in JavaScript.
branch: master
Failed to load latest commit information.
src First release
test First release
.gitignore First release
.npmignore First release
.travis.yml Update .travis.yml Added travis-ci
cls.js First release
cls.min.js First release
package.json First release


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


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() {


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.

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({ ... });


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


$ 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
    constructor: (@name) ->

    move: (meters) ->
      log "#{@name} moved #{meters} meters"

    types: ['vertebrates', 'invertebrates']

Snake = Cls
  uber: Animal
    move: ->
      log "Slithering..."
      setTimeout =>
        this.inherited 'move', [5]
      , 300

Horse = Cls
  uber: Animal
    move: ->
      log "Galloping..."
      args = arguments
      setTimeout =>
        this.inherited 'move', args
      , 1500

sam = new Snake "Sammy the Python"
tom = new Horse "Tommy the Palomino"

Something went wrong with that request. Please try again.