New connectors can be defined in the `joint.connectors` namespace (e.g. `joint.connectors.myConnector`) or passed directly as a function to the `connector` property of a link (or to the `defaultConnector` paper option).

In either case, the connector function must return a g.Path representing the SVG path data that will be used to render the link. The function is expected to have the form `function(sourcePoint, targetPoint, routePoints, args)`:

sourcePoint | g.Point | The source connection point.
targetPoint | g.Point | The target connection point.
routePoints | Array<g.Point> | The points of the route, as returned by the router in use.
args | object | An object with additional optional arguments passed to the connector method by the user when it was called (the `args` property).

Example of a connector defined in the `joint.connectors` namespace:

    joint.connectors.wobble = function(sourcePoint, targetPoint, vertices, args) {

        var SPREAD = args.spread || 20;

        var points = vertices.concat(targetPoint)
        var prev = sourcePoint;
        var path = new g.Path(g.Path.createSegment('M', prev));

        var n = points.length;
        for (var i = 0; i < n; i++) {

            var next = points[i];
            var distance = prev.distance(next);

            var d = SPREAD;
            while (d < distance) {
                var current = prev.clone().move(next, -d);
                current.offset(
                    Math.floor(7 * Math.random()) - 3,
                    Math.floor(7 * Math.random()) - 3
                );
                path.appendSegment(g.Path.createSegment('L', current));
                d += SPREAD;
            }

            path.appendSegment(g.Path.createSegment('L', next));
            prev = next;
        }

        return path;
    }

    var link = new joint.shapes.standard.Link();
    link.source(source);
    link.target(target);

    link.connector('wobble', {
        spread: 10
    });

An example of a connector passed as a function is provided below. Notice that this approach does not enable passing custom `args` nor can it be serialized with the `graph.toJSON()` function.

    var link = new joint.shapes.standard.Link();
    link.source(source);
    link.target(target);

    link.connector(function(sourcePoint, targetPoint, vertices, args) {

        var SPREAD = 20;

        var points = vertices.concat(targetPoint)
        var prev = sourcePoint;
        var path = new g.Path(g.Path.createSegment('M', prev));

        var n = points.length;
        for (var i = 0; i < n; i++) {

            var next = points[i];
            var distance = prev.distance(next);

            var d = SPREAD;
            while (d < distance) {
                var current = prev.clone().move(next, -d);
                current.offset(
                    Math.floor(7 * Math.random()) - 3,
                    Math.floor(7 * Math.random()) - 3
                );
                path.appendSegment(g.Path.createSegment('L', current));
                d += SPREAD;
            }

            path.appendSegment(g.Path.createSegment('L', next));
            prev = next;
        }

        return path;
    });