The most simple, customizable and easy to use JavaScript standard inheritance library.
- Support the new operator.
- Support the instanceof operator.
- Support the standard OO inheritance
- Support super constructor automatic call
- Support extending a class C via C.prototype
- Support automatic 'getters', 'setters' methods generation
- Support surcharged methods, call a specific method from arguments count
- Support custom class definition format (configure all plugins)
- Support customs plugins (create your own plugin or use defaults)
- Support plugins management (whitelist, blacklist plugin from your class definition)
@ Inspired by Douglass Crockford’s website :(http://javascript.crockford.com/prototypal.html).
@ Inspired by Cyril Agosta’s library : (https://github.com/cagosta/SeedHq).
@ Inspired by Angular Framework : (https://github.com/angular/angular.js).
@ Inspired by JQuery extend's function : (https://github.com/jquery/jquery).
var Human = Embryo.extend({
'_type': 'Human', // define class internal type
properties : { // define all class properties
name: 'John',
score: 1000,
power: 2,
options: [
'super',
]
},
init: function() { // define class constructor
this.lifes = 3
},
walk: function() {
console.log('walk', this.power)
},
run: function() { // define a simple method
console.log('0 arg')
},
'run|1': function( arg1 ) { // define a surcharged method
console.log('1 arg') // when you call run( 'foo' )
},
'run|2': function( arg1, arg2 ) { // define a surcharged method
console.log('2 args') // when you call run( 'foo', 'bar' )
},
'run|3': function( arg1, arg2, arg3 ) {
console.log('3 args')
}
})
var Superman = Human.extend({
'_type': 'Superman',
'_blacklist': [
'Attribute', // Attribute plugin blacklisted for this class
'*' // All plugins are blacklisted for this class
],
properties : {
name: 'Clark Kent',
score: 5000,
power: 10,
options: [
'super',
'godness',
'unlimited'
]
},
init: function() {
this.lifes = 10
},
'-walk': function() { // called before 'walk' call
console.log('before walk')
},
'+walk': function() { // called after 'walk' call
console.log('after walk')
},
fly: function() {
console.log('fly', this.power)
}
})
var human = new Human() human.walk() // -> walk: 2 console.log( human.getScore() ) // -> 1000 console.log( human.getName() ) // -> John console.log( human.getOptions() ) // -> ['super']
human.run() // -> call method run() human.run( '1' ) // -> call method human'run|1' human.run( '1', '2' ) // -> call method human'run|2' human.run( '1', '2', '3' ) // -> call method human'run|3' human.run( '1', '2', '3', '4' ) // -> call default method run()
var superman = new Superman() superman.walk() // -> before walk // -> walk: 10 // -> after walk superman.fly() // -> fly: 10 superman.getFly() // Error, Attribute plugin blacklisted, // there is no generated method with name 'getFly'
console.log( human instanceof Human ) // -> true console.log( human instanceof Superman ) // -> false console.log( superman instanceof Human ) // -> true
Configure
-----
To configure Embryo :
```javascript
Embryo.configure({
cstrName: 'init', // default class constructor name
cstrArrayName: '_types', // default constructors array name
forceCstr: true, // class constructor required ?
nameType: '_type', // default class type property name
typeDefault: 'Embryo', // default class type value
forceTyping: true, // add a default class type if not exists
nameProperties: 'properties', // default property object name
nameBlacklist: '_blacklist', // array key witch contains disabled plugins names
deleteBlacklist: true // delete blacklist array before class instanciation ?
})
Embryo enables by default 4 plugins :
- Attribute : A plugin to generate "getters" and "setters" methods
- BeforeAfter : A plugin to redefine/control super methods execution
- Surcharge : A plugin to allow you call specific method with multiple arguments
},
//
// Embryo execute this function for all class creation
// o: class properties
// debug: debug mode for this plugin
// child: class's prototype
//
exec: function( o, debug, child ) {
// Check if your plugin is blacklisted for this class
if (this.isBlacklisted( o )) {
debug && console.log( '[' + this.name + '] - SKIPPED' )
return o
}
// if debug mode is enabled for this plugin,
// show all class property before class creation
debug && debug( this.name, 'BEFORE', o )
// your plugin's code...
// if debug mode is enabled for this plugin,
// show all class property after class creation
debug && debug( this.name, 'AFTER', o )
// return new class properties
return o
}
})
// Create an instance of your plugin var myPlugin = new MyPlugin() // Tell embryo to use your new plugin // use( plugin, debug ) Embryo.use( myPlugin, false ) // Now, you will able to reconfigure your plugin later... Embryo.plugins('MyPlugin').configure({ option1: 'value1', // your plugin's options... option2: 'value2', option3: 'value3' })