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 });
        }
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