docs: @Override
      public Object execIdCall(IdFunctionObject f, Context cx, Scriptable scope,
                               Scriptable thisObj, Object[] args)
      {
          if (!f.hasTag(getClassName())) {
              return super.execIdCall(f, cx, scope, thisObj, args);
          }
          int id = f.methodId();
          switch (id) {
          case Id_constructor:
              return js_constructor(cx, scope, args);
  
          case Id_toString:
              NativeTypedArrayView<T> realThis = realThis(thisObj, f);
              final int arrayLength = realThis.getArrayLength();
              final StringBuilder builder = new StringBuilder();
              if (arrayLength > 0) {
                  builder.append(ScriptRuntime.toString(realThis.js_get(0)));
              }
              for (int i = 1; i < arrayLength; i++) {
                  builder.append(',');
                  builder.append(ScriptRuntime.toString(realThis.js_get(i)));
              }
              return builder.toString();
  
          case Id_get:
              if (args.length > 0) {
                  return realThis(thisObj, f).js_get(ScriptRuntime.toInt32(args[0]));
              }
              throw ScriptRuntime.constructError("Error", "invalid arguments");
  
          case Id_set:
              if (args.length > 0) {
                  NativeTypedArrayView<T> self = realThis(thisObj, f);
                  if (args[0] instanceof NativeTypedArrayView) {
                      int offset = isArg(args, 1) ? ScriptRuntime.toInt32(args[1]) : 0;
                      self.setRange((NativeTypedArrayView<T>)args[0], offset);
                      return Undefined.instance;
                  }
                  if (args[0] instanceof NativeArray) {
                      int offset = isArg(args, 1) ? ScriptRuntime.toInt32(args[1]) : 0;
                      self.setRange((NativeArray)args[0], offset);
                      return Undefined.instance;
                  }
                  if (args[0] instanceof Scriptable) {
                      // Tests show that we need to ignore a non-array object
                      return Undefined.instance;
                  }
                  if (isArg(args, 2)) {
                      return self.js_set(ScriptRuntime.toInt32(args[0]), args[1]);
                  }
              }
              throw ScriptRuntime.constructError("Error", "invalid arguments");
  
          case Id_subarray:
              if (args.length > 0) {
                  NativeTypedArrayView<T> self = realThis(thisObj, f);
                  int start = ScriptRuntime.toInt32(args[0]);
                  int end = isArg(args, 1) ? ScriptRuntime.toInt32(args[1]) : self.length;
                  return self.js_subarray(cx, scope, start, end);
              }
              throw ScriptRuntime.constructError("Error", "invalid arguments");
  
          case SymbolId_iterator:
              return new NativeArrayIterator(scope, thisObj, ARRAY_ITERATOR_TYPE.VALUES);
          }
          throw new IllegalArgumentException(String.valueOf(id));
      }