--- /dev/null
+'use strict';
+var InternalStateModule = require('../internals/internal-state');
+var createIteratorConstructor = require('../internals/create-iterator-constructor');
+var has = require('../internals/has');
+var objectKeys = require('../internals/object-keys');
+var toObject = require('../internals/to-object');
+
+var OBJECT_ITERATOR = 'Object Iterator';
+var setInternalState = InternalStateModule.set;
+var getInternalState = InternalStateModule.getterFor(OBJECT_ITERATOR);
+
+module.exports = createIteratorConstructor(function ObjectIterator(source, mode) {
+ var object = toObject(source);
+ setInternalState(this, {
+ type: OBJECT_ITERATOR,
+ mode: mode,
+ object: object,
+ keys: objectKeys(object),
+ index: 0
+ });
+}, 'Object', function next() {
+ var state = getInternalState(this);
+ var keys = state.keys;
+ while (true) {
+ if (keys === null || state.index >= keys.length) {
+ state.object = state.keys = null;
+ return { value: undefined, done: true };
+ }
+ var key = keys[state.index++];
+ var object = state.object;
+ if (!has(object, key)) continue;
+ switch (state.mode) {
+ case 'keys': return { value: key, done: false };
+ case 'values': return { value: object[key], done: false };
+ } /* entries */ return { value: [key, object[key]], done: false };
+ }
+});