function defineProperties( obj, props ) {
	var keys;
	var name;
	var i;

	if ( !isObject( obj ) ) {
		throw new TypeError( format( 'invalid argument. First argument must be an object. Value: `%s`.', obj ) );
	}
	if ( !isObject( props ) ) {
		throw new TypeError( format( 'invalid argument. Second argument must be an object containing property descriptors. Value: `%s`.', props ) );
	}
	keys = objectKeys( props );
	for ( i = 0; i < keys.length; i++ ) {
		name = keys[ i ];
		defineProperty( obj, name, props[ name ] );
	}
	return obj;
}
Defines (and/or modifies) properties.

@param {Object} obj - object on which to define the properties
@param {Object} props - object with property descriptors
@throws {TypeError} first argument must be an object
@throws {TypeError} second argument must be an object
@returns {Object} object with added and/or modified properties

@example
var obj = {};
defineProperties( obj, {
    'foo': {
        'value': 'bar'
    },
    'baz': {
         'value': 13
    }
});

var val = obj.foo;
// returns 'bar'

val = obj.baz;
// returns 13