Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

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

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.
lib/cc
test
.gitignore
Cakefile
README.md
cc.extend.coffee
package.json

README.md

cc.extend

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

installation

To install globally:

sudo npm install -g cc.extend

usage

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
    console.log('cat')
  },
  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')
    this.parent(word)
  }
})

// construction of the housecat will log 'cat'
var animal = new HouseCat,
    isTrue = (animal instanceof Animal)

animal.talk('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.
HouseCat.inject({
  talk: function(word) {
    // call non-injected version of HouseCat.talk().
    this.parent(word)
    log('prr')
  }
}).inject({
  talk: function(word) {
    log('prr prr')
    this.parent(word) // call inject function defined above
  }
})

animal.talk('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({ ... })

testing

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

faq

Something went wrong with that request. Please try again.