Extends the properties on the provided arguments into the original item.
Any properties on the tail arguments will not overwrite any properties
on the first argument unless they are null or undefined,
and any non primitive references will be shallow.

@param {any} a The target to be extended.
@param {...any} rest The tail items to extend onto the target.
@returns {any} A reference to the extended target.
function extend(a, ...rest) {
    rest.forEach(b => {
        if (isExtendable(a, b))
            _extend(a, b);
    });
    return a;
}