2 var InternalStateModule = require('../internals/internal-state');
3 var createIteratorConstructor = require('../internals/create-iterator-constructor');
4 var hasOwn = require('../internals/has-own-property');
5 var objectKeys = require('../internals/object-keys');
6 var toObject = require('../internals/to-object');
8 var OBJECT_ITERATOR = 'Object Iterator';
9 var setInternalState = InternalStateModule.set;
10 var getInternalState = InternalStateModule.getterFor(OBJECT_ITERATOR);
12 module.exports = createIteratorConstructor(function ObjectIterator(source, mode) {
13 var object = toObject(source);
14 setInternalState(this, {
15 type: OBJECT_ITERATOR,
18 keys: objectKeys(object),
21 }, 'Object', function next() {
22 var state = getInternalState(this);
23 var keys = state.keys;
25 if (keys === null || state.index >= keys.length) {
26 state.object = state.keys = null;
27 return { value: undefined, done: true };
29 var key = keys[state.index++];
30 var object = state.object;
31 if (!hasOwn(object, key)) continue;
33 case 'keys': return { value: key, done: false };
34 case 'values': return { value: object[key], done: false };
35 } /* entries */ return { value: [key, object[key]], done: false };