For one: core types like Temporal and Promise are nominally-identified. i.e. they have an identity that goes beyond just plain objects with a particular set of properties. Oftentimes when people advocate for "plain functions" over constructors in JS, what they're really advocating for is using "plain data"(objects, arrays, primitives, etc). There are lots of good reasons to use plain data in JS - transparency, serializability/deserializability, duck-behavior, etc - but all of that is irrelevant for these special objects.
Now of course you could provide a plain function that returns a special, nominally-identified object. But at that point there are basically no advantages over using a constructor (unless you need multiple such functions that take different kinds of arguments); the difference is almost entirely superficial, and constructors do a slightly better job of advertising that their return values are special, and also have precedent and therefore familiarity
Now of course you could provide a plain function that returns a special, nominally-identified object. But at that point there are basically no advantages over using a constructor (unless you need multiple such functions that take different kinds of arguments); the difference is almost entirely superficial, and constructors do a slightly better job of advertising that their return values are special, and also have precedent and therefore familiarity