docs: private static Object jsConstructor(Context cx, Scriptable scope,
                                          Scriptable thisObj, Object[] args)
      {
          if (args.length == 0 || args[0] == null ||
              args[0] == Undefined.instance)
          {
              Object argument = args.length == 0 ? Undefined.instance : args[0];
              throw ScriptRuntime.typeError1("msg.no.properties",
                                             ScriptRuntime.toString(argument));
          }
          Scriptable obj = ScriptRuntime.toObject(cx, scope, args[0]);
          boolean keyOnly = args.length > 1 && ScriptRuntime.toBoolean(args[1]);
          if (thisObj != null) {
              // Called as a function. Convert to iterator if possible.
  
              // For objects that implement java.lang.Iterable or
              // java.util.Iterator, have JavaScript Iterator call the underlying
              // iteration methods
              Iterator<?> iterator =
                  VMBridge.instance.getJavaIterator(cx, scope, obj);
              if (iterator != null) {
                  scope = ScriptableObject.getTopLevelScope(scope);
                  return cx.getWrapFactory().wrap(cx, scope,
                          new WrappedJavaIterator(iterator, scope),
                          WrappedJavaIterator.class);
              }
  
              // Otherwise, just call the runtime routine
              Scriptable jsIterator = ScriptRuntime.toIterator(cx, scope, obj,
                                                               keyOnly);
              if (jsIterator != null) {
                  return jsIterator;
              }
          }
  
          // Otherwise, just set up to iterate over the properties of the object.
          // Do not call __iterator__ method.
          Object objectIterator = ScriptRuntime.enumInit(obj, cx, scope,
              keyOnly ? ScriptRuntime.ENUMERATE_KEYS_NO_ITERATOR
                      : ScriptRuntime.ENUMERATE_ARRAY_NO_ITERATOR);
          ScriptRuntime.setEnumNumbers(objectIterator, true);
          NativeIterator result = new NativeIterator(objectIterator);
          result.setPrototype(ScriptableObject.getClassPrototype(scope,
                                  result.getClassName()));
          result.setParentScope(scope);
          return result;
      }