    define(type [, defaultAttributes, prototypeProperties, staticProperties])

Helper to define a new Cell class or extend an existing one.

The `type` must be a unique identifier of the class, which determines the location of the class definition in the `joint.shapes` namespace (`type` is the path to the class definition delimited by dots: `.`). When creating an instance of the cell, attributes will be set to the value from the `defaultAttributes`, unless overridden by subclass or instance attributes.

    // Define a new Ellipse class in `joint.shapes.examples` namespace
    // Inherits from generic Element class
    var Ellipse = joint.dia.Element.define('examples.Ellipse', {
        // default attributes
        markup: [{
            tagName: 'ellipse',
            selector: 'ellipse' // not necessary but faster
        ],
        attrs: {
            ellipse: {
                fill: 'white',
                stroke: 'black',
                strokeWidth: 4,
                refRx: .5,
                refRy: .5,
                refCx: .5,
                refCy: .5
            }
        }
    });

    // Instantiate an element
    var ellipse = (new Ellipse()).position(100, 100).size(120, 50).addTo(graph);

    // Define a new ColoredEllipse class
    // Inherits from Ellipse
    var ColoredEllipse = Ellipse.define('examples.ColoredEllipse', {
        // overridden Ellipse default attributes
        // other Ellipse attributes preserved
        attrs: {
            ellipse: {
                fill: 'lightgray'
            }
        }
    }, {
        // prototype properties
        // accessible on `this.(...)` - as well as, more precisely, `this.prototype.(...)`
        // useful for custom methods that need access to this instance
        // shared by all instances of the class
        randomizeStrokeColor: function() {
            var randomColor = '#' + ('000000' + Math.floor(Math.random() * 16777215).toString(16)).slice(-6);
            return this.attr('ellipse/stroke', randomColor);
        }
    }, {
        // static properties
        // accessible on `this.constructor.(...)`
        // useful for custom methods and constants that do not need an instance to operate
        // however, a new set of static properties is generated every time the constructor is called
        // (try to only use static properties if absolutely necessary)
        createRandom: function() {
            return (new ColoredEllipse()).randomizeStrokeColor();
        }
    });

    // Instantiate an element
    var coloredEllipse = ColoredEllipse.createRandom().position(300, 100).size(120, 50).addTo(graph);