Skip to content


Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Class inheritence system for JavaScript including support for easy super method calls.
tag: 0.10.0

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.


A simple class creation system allowing methods, attributes and access to super methods from classes.


To install globally:

sudo npm install -g cc.extend


cc.extend - class inheritance

var Animal = cc.extend(Function, {})
// same: var Animal = cc.Class.extend({})

constructors and methods

cc.extend adds ".extend" as an instance method of the returned class which can be used to simplify subclassing:

var Cat = Animal.extend({
  init: function(name) {
    // init is called as a constructor
  talk: function(word) {
    console.log('hiss (' + word + ')')

attributes and calling super methods

"this.parent" can be used in a method to call the parent version of that method if it exists. Non-function values in an extend object become class attributes.

var HouseCat = Cat.extend({
  type: 'friendly cat',
  talk: function(word) {
    console.log(this.type + ': meow')

// construction of the housecat will log 'cat'
var animal = new HouseCat,
    isTrue = (animal instanceof Animal)'mose') // logs "friendly cat: meow", "hiss(mose)"

note on copying of attributes

When a new object is constructed all attributes of type Object are deep cloned from the prototype into the new object unless:

  • They are HTML Elements.
  • They are an instance of cc.Class.

Objects of the following class would be copied into attributes of newly constructed classes:

var Animal = cc.extend(Function, { ... })

The following object would be referenced in attributes due to being an instance of cc.Class.

var Animal = cc.Class.extend({ ... })

using inject to modify a class in place

cc.extend returns a new child class whilst cc.inject can be used to modify a class. Inside of a method overridden with cc.inject, "this.parent" refers to the overridden method.

// a class created with cc.extend also gets a static "inject" method.
  talk: function(word) {
    // call non-injected version of
  talk: function(word) {
    log('prr prr')
    this.parent(word) // call inject function defined above
})'kit') // logs "prr prr", "friendly cat: meow", "hiss(kit)", "prr"

using with cc.loader

// file lib/project/Cat.js
// creates class accessible via "project.Cat"
cc.module('project.Cat').defines(function() {
  this.set(Class.extend({ ... }))
// file lib/project/HouseCat.js
// requires lib/project/Cat.js file and sets project.Cat as parent of project.HouseCat
cc.module('HouseCat').parent('project.Cat').jClass({ ... })


% git clone git://
% cd cc.extend
% npm test
cc.extend test server listening on: 8013
please go to http://localhost:8013/


Something went wrong with that request. Please try again.