@@ -775,3 +775,49 @@ const proxyWithNullPrototypeObject = new Proxy(objectToProxy, {
775775});
776776console .log (proxyWithNullPrototypeObject .someProperty ); //  genuine value
777777``` 
778+ 
779+ ### Checking if an object is an instance of a class  
780+ 
781+ #### Using ` instanceof `  looks up the ` @@hasInstance `  property of the class  
782+ 
783+ ``` js 
784+ //  User-land
785+ Object .defineProperty (Array , Symbol .hasInstance , {
786+   __proto__:  null ,
787+   value :  () =>  true ,
788+ });
789+ Object .defineProperty (Date , Symbol .hasInstance , {
790+   __proto__:  null ,
791+   value :  () =>  false ,
792+ });
793+ 
794+ //  Core
795+ const  {
796+   FunctionPrototypeSymbolHasInstance ,
797+ } =  primordials;
798+ 
799+ console .log (new  Date () instanceof  Array ); //  true
800+ console .log (new  Date () instanceof  Date ); //  false
801+ 
802+ console .log (FunctionPrototypeSymbolHasInstance (Array , new  Date ())); //  false
803+ console .log (FunctionPrototypeSymbolHasInstance (Date , new  Date ())); //  true
804+ ``` 
805+ 
806+ Even without user mutations, the result of ` instanceof `  can be deceiving when
807+ dealing with values from different realms:
808+ 
809+ ``` js 
810+ const  vm  =  require (' node:vm' 
811+ 
812+ console .log (vm .runInNewContext (' []' instanceof  Array ); //  false
813+ console .log (vm .runInNewContext (' []' instanceof  vm .runInNewContext (' Array' //  false
814+ console .log ([] instanceof  vm .runInNewContext (' Array' //  false
815+ 
816+ console .log (Array .isArray (vm .runInNewContext (' []' //  true
817+ console .log (vm .runInNewContext (' Array' isArray (vm .runInNewContext (' []' //  true
818+ console .log (vm .runInNewContext (' Array' isArray ([])); //  true
819+ ``` 
820+ 
821+ In general, using ` instanceof `  (or ` FunctionPrototypeSymbolHasInstance ` ) checks
822+ is not recommended, consider checking for the presence of properties or methods
823+ for more reliable results.
0 commit comments