lib/reflect.js
function() {
    var trap = this.getTrap("ownKeys");
    if (trap === undefined) {
      // default forwarding behavior
      return Reflect.ownKeys(this.target);
    }

    var trapResult = trap.call(this.handler, this.target);

    if (trapResult === null || typeof trapResult !== "object") {
      throw new TypeError("ownKeys should return an iterator object, got " +
                          trapResult);
    }

    return trapResult;
  }
function() {
    var trap = this.getTrap("ownKeys");
    if (trap === undefined) {
      // default forwarding behavior
      return Reflect.ownKeys(this.target);
    }

    var trapResult = trap.call(this.handler, this.target);

    if (trapResult === null || typeof trapResult !== "object") {
      throw new TypeError("ownKeys should return an iterator object, got " +
                          trapResult);
    }

    return trapResult;
  }
In ES6, this trap is called for all operations that require a list
of an object's properties, including Object.getOwnPropertyNames
and Object.keys.

The trap should return an iterator. The proxy implementation only
checks whether the return value is an object.