sjl.js
function ObjectIterator(keysOrObj, values) {
            var obj,
                classOfParam0 = sjl.classOf(keysOrObj),
                receivedParamTypesList,
                _values,
                _keys;

            // Constructor scenario 1 (if param `0` is of type `Object`)
            if (classOfParam0 === 'Object') {
                obj = keysOrObj;
                _keys = Object.keys(obj);
                _values = _keys.map(function (key) {
                    return obj[key];
                });
            }

            // Constructor scenario 2 (if param `0` is of type `Array`)
            else if (classOfParam0 === 'Array') {
                sjl.throwTypeErrorIfNotOfType(contextName, 'values', values, Array,
                    'With the previous param being an array `values` can only be an array in this scenario.');
                _keys = keysOrObj;
                _values = values;
            }

            // Else failed constructor scenario
            else {
                receivedParamTypesList = [classOfParam0, sjl.classOf(values)];
                throw new TypeError ('#`' + contextName + '` received incorrect parameter values.  The expected ' +
                    'parameter list should be one of two: [Object] or [Array, Array].  ' +
                    'Parameter list received: [' + receivedParamTypesList.join(', ') + '].');
            }

            // Extend #own properties with #Iterator's own properties
            Iterator.call(this, _values);

            // @note Defining member jsdoc blocks here since our members are defined using Object.defineProperties()
            //   and some IDEs don't handle this very well (E.g., WebStorm)

            /**
             * Object iterator keys.  Set on construction.
             * @member {Array<*>} sjl.stdlib.ObjectIterator#keys
             * @readonly
             */

            // Define other own propert(y|ies)
            Object.defineProperty(this, '_keys', { value: _keys });
        }
function ObjectIterator(keysOrObj, values) {
            var obj,
                classOfParam0 = sjl.classOf(keysOrObj),
                receivedParamTypesList,
                _values,
                _keys;

            // Constructor scenario 1 (if param `0` is of type `Object`)
            if (classOfParam0 === 'Object') {
                obj = keysOrObj;
                _keys = Object.keys(obj);
                _values = _keys.map(function (key) {
                    return obj[key];
                });
            }

            // Constructor scenario 2 (if param `0` is of type `Array`)
            else if (classOfParam0 === 'Array') {
                sjl.throwTypeErrorIfNotOfType(contextName, 'values', values, Array,
                    'With the previous param being an array `values` can only be an array in this scenario.');
                _keys = keysOrObj;
                _values = values;
            }

            // Else failed constructor scenario
            else {
                receivedParamTypesList = [classOfParam0, sjl.classOf(values)];
                throw new TypeError ('#`' + contextName + '` received incorrect parameter values.  The expected ' +
                    'parameter list should be one of two: [Object] or [Array, Array].  ' +
                    'Parameter list received: [' + receivedParamTypesList.join(', ') + '].');
            }

            // Extend #own properties with #Iterator's own properties
            Iterator.call(this, _values);

            // @note Defining member jsdoc blocks here since our members are defined using Object.defineProperties()
            //   and some IDEs don't handle this very well (E.g., WebStorm)

            /**
             * Object iterator keys.  Set on construction.
             * @member {Array<*>} sjl.stdlib.ObjectIterator#keys
             * @readonly
             */

            // Define other own propert(y|ies)
            Object.defineProperty(this, '_keys', { value: _keys });
        }
function ObjectIterator ( keysOrObj , values ) { var obj , classOfParam0 = sjl . classOf ( keysOrObj ) , receivedParamTypesList , _values , _keys ; // Constructor scenario 1 (if param `0` is of type `Object`) if ( classOfParam0 === 'Object' ) { obj = keysOrObj ; _keys = Object . keys ( obj ) ; _values = _keys . map ( function ( key ) { return obj [ key ] ; } ) ; } // Constructor scenario 2 (if param `0` is of type `Array`) else if ( classOfParam0 === 'Array' ) { sjl . throwTypeErrorIfNotOfType ( contextName , 'values' , values , Array , 'With the previous param being an array `values` can only be an array in this scenario.' ) ; _keys = keysOrObj ; _values = values ; } // Else failed constructor scenario else { receivedParamTypesList = [ classOfParam0 , sjl . classOf ( values ) ] ; throw new TypeError ( '#`' + contextName + '` received incorrect parameter values.  The expected ' + 'parameter list should be one of two: [Object] or [Array, Array].  ' + 'Parameter list received: [' + receivedParamTypesList . join ( ', ' ) + '].' ) ; } // Extend #own properties with #Iterator's own properties Iterator . call ( this , _values ) ; // @note Defining member jsdoc blocks here since our members are defined using Object.defineProperties() //   and some IDEs don't handle this very well (E.g., WebStorm) /**
             * Object iterator keys.  Set on construction.
             * @member {Array<*>} sjl.stdlib.ObjectIterator#keys
             * @readonly
             */ // Define other own propert(y|ies) Object . defineProperty ( this , '_keys' , { value : _keys } ) ; }
Constructor.
@param keysOrObj {Array|Object} - Array of keys or object to create (object) iterator from.
@param values {Array|Undefined} - Array of values if first param is an array.
@constructor
@private
Constructor .