Lightweight JavaScript prototypal inheritance model
JavaScript
Switch branches/tags
Nothing to show
Pull request Compare This branch is 34 commits ahead of Iheartweb:master.
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
docs
.travis.yml
LICENSE.txt
README.md
fiber.js
fiber.min.js
index.html
test.html

README.md

Fiber.js

JavaScript Inheritance Model

Inheritance

Usage

[[constructor]].extend( function )

Example

// Animal base class
var Animal = Fiber.extend(function() {
    return {
        // The `init` method serves as the constructor.
        init: function() {
            // Private
            function private1(){}
            function private2(){}

            // Privileged
            this.privileged1 = function(){}
            this.privileged2 = function(){}
        },
        // Public
        method1: function(){}
    }
});

The init method acts as the constructor, which is invoked when an instance is created:

var animal = new Animal(); // Create a new Animal instance

init is invoked automatically.

Inheritance

// Extend the Animal class.
var Dog = Animal.extend(function() {
    return {
        // Override base class `method1`
        method1: function(){
            console.log('dog::method1');
        },
        scare: function(){
            console.log('Dog::I scare you');
        }
    }
});

Create an instance of Dog:

var husky = new Dog();
husky.scare(); // "Dog::I scare you'"

Accessing parent prototype

Every class definition has access to the parent's prototype via the first argument passed into the function:

// Extend the Animal class.
var Dog = Animal.extend(function( base ) {
    return {
        // Override base class `method1`
        method1: function(){
            // Call the parent method
            base.method1.call(this);
        },
        scare: function(){
            console.log('Dog::I scare you');
        }
    }
});

Mixin

Mixins are a way to add functionality to a Fiber definition. Basically, they address the problem of "multiple inheritance". Read more.

Usage

Fiber.mixin( object, function1, function2, ... )

var Foo = Fiber.extend(function(base) {
    return {
        method1: function(){}
    }
});

var f = new Foo();
f.method1();

var mix1 = function(base) {
    return  {
        method2: function() {}
    }
}

Fiber.mixin(Foo, mix1);

f.method2();

Decorators

With decorators you can dynamically attach additional properties to an instance. Read more.

Usage

Fiber.decorate( instance, decorator_1, ... , decorator_n )

function CarWithPowerWindows(base) {
    return {
        roll: function() {}
    }
}

Fiber.decorate(myCar, CarWithPowerWindows);

Proxy

Usage

Fiber.proxy( base, instance )

// Extend the Animal class;
var Dog = Animal.extend(function(base) {
    return {
        init: function() {
            this.base = Fiber.proxy(base, this);
            this.base.init();
        }
    }
});

noConflict

Usage

Fiber.noConflict()

Returns a reference to the Fiber object, and sets the Fiber variable to its previous owner.