@@ -822,6 +822,10 @@ void InstallNativeApiJsiGlobalSymbols(Runtime& runtime, const char* globalName)
822822 classMembersInstalled = true;
823823 installClassMembers(constructable, nativeClass.__staticMembers, true);
824824 installClassMembers(basePrototypeTarget, nativeClass.__instanceMembers, false);
825+ try {
826+ delete constructable.__nativeApiInstallMembers;
827+ } catch (_) {
828+ }
825829 }
826830 try {
827831 Object.defineProperty(constructable, '__nativeApiInstallMembers', {
@@ -869,6 +873,7 @@ void InstallNativeApiJsiGlobalSymbols(Runtime& runtime, const char* globalName)
869873 constructable.prototype = typeof Proxy === 'function'
870874 ? new Proxy(basePrototypeTarget, {
871875 get: function(target, property, receiver) {
876+ installNativeClassMembersIfNeeded();
872877 if (property in target) {
873878 return Reflect.get(target, property, receiver);
874879 }
@@ -902,7 +907,16 @@ void InstallNativeApiJsiGlobalSymbols(Runtime& runtime, const char* globalName)
902907 return true;
903908 },
904909 has: function(target, property) {
910+ installNativeClassMembersIfNeeded();
905911 return property in target;
912+ },
913+ ownKeys: function(target) {
914+ installNativeClassMembersIfNeeded();
915+ return Reflect.ownKeys(target);
916+ },
917+ getOwnPropertyDescriptor: function(target, property) {
918+ installNativeClassMembersIfNeeded();
919+ return Reflect.getOwnPropertyDescriptor(target, property);
906920 }
907921 })
908922 : basePrototypeTarget;
@@ -952,12 +966,27 @@ void InstallNativeApiJsiGlobalSymbols(Runtime& runtime, const char* globalName)
952966 if (property === '__nativeApiClass') {
953967 return nativeClass;
954968 }
969+ if (property === 'toString') {
970+ return function() {
971+ return String(nativeClass);
972+ };
973+ }
974+ if (property === 'hasOwnProperty') {
975+ return function(key) {
976+ installNativeClassMembersIfNeeded();
977+ return Object.prototype.hasOwnProperty.call(target, key);
978+ };
979+ }
955980 if (Object.prototype.hasOwnProperty.call(target, property) ||
956981 property === 'prototype' ||
957982 property === 'length' ||
958983 property === 'name') {
959984 return Reflect.get(target, property, receiver);
960985 }
986+ installNativeClassMembersIfNeeded();
987+ if (Object.prototype.hasOwnProperty.call(target, property)) {
988+ return Reflect.get(target, property, receiver);
989+ }
961990 if (cachedNativeFunctions && cachedNativeFunctions.has(property)) {
962991 return cachedNativeFunctions.get(property);
963992 }
@@ -1015,13 +1044,37 @@ void InstallNativeApiJsiGlobalSymbols(Runtime& runtime, const char* globalName)
10151044 return Reflect.set(target, property, value, receiver);
10161045 },
10171046 has: function(target, property) {
1047+ installNativeClassMembersIfNeeded();
10181048 return property in target || property in nativeClass;
1049+ },
1050+ ownKeys: function(target) {
1051+ installNativeClassMembersIfNeeded();
1052+ return Reflect.ownKeys(target).filter(function(key) {
1053+ return key !== 'new' &&
1054+ key !== 'hasOwnProperty' &&
1055+ key !== '__nativeApiInstallMembers';
1056+ });
1057+ },
1058+ getOwnPropertyDescriptor: function(target, property) {
1059+ installNativeClassMembersIfNeeded();
1060+ return Reflect.getOwnPropertyDescriptor(target, property);
10191061 }
10201062 })
10211063 : constructable;
10221064 if (classWrappers) {
10231065 classWrappers.set(nativeClass, wrapper);
10241066 }
1067+ try {
1068+ var nativeSuperclass = nativeClass.__superclass;
1069+ if (nativeSuperclass && nativeSuperclass !== nativeClass) {
1070+ var superclassWrapper = wrapNativeClass(nativeSuperclass);
1071+ if (superclassWrapper && superclassWrapper !== wrapper &&
1072+ typeof Object.setPrototypeOf === 'function') {
1073+ Object.setPrototypeOf(wrapper, superclassWrapper);
1074+ }
1075+ }
1076+ } catch (_) {
1077+ }
10251078 try {
10261079 api.__rememberClassWrapper(nativeClass, wrapper, constructable.prototype);
10271080 } catch (_) {
0 commit comments