That's because, by definition, the purpose of constructors is producing objects, not primitives:
4.3.4 constructor
function object that creates and initialises objects
Therefore, the [[Construct]] internal method (called via the new operator), checks the type of the value returned by [[Call]]:
13.2.2 [[Construct]]
- Let result be the result of calling the [[Call]] internal property of F, providing obj as the this value and providing
the argument list passed into [[Construct]] as args.
- If Type(result) is Object then return result.
- Return obj.
In fact, this is an invariant:
[[Construct]] ( )
- The Type of the return value must be Object.