Yes, the typing and semantic models are wildly different. The point is that they’re primitive in a way that the other widespread alternative, C++, did not inherit from its Cfront heritage.
There's tons of libraries that use some kind of runtime-observable instance property as a tag, to mimic nominal typing in JS.
The same thing is also possible using prototype identity, if you either use the class keyword syntax sugar introduced with ES5 (?), or if you manually do OOP using prototypes. But the latter is very uncommon.
Yes, the typing and semantic models are wildly different. The point is that they’re primitive in a way that the other widespread alternative, C++, did not inherit from its Cfront heritage.