In our example, we are initializing the new object by setting the two properties first name and last name. If I put in a couple of log statements, we can trace how the person object is put together step by step. We also see the name of the constructor function in notes console output.
This shows us that our new object has been linked to the person function's prototype. Notice that our person function doesn't contain a return statement. In that case, the brand-new object that was constructed for us is returned automatically.
You can imagine an invisible return this statement at the end of the function. We can also return an entirely different object from the constructor function. After we return from the function, the newly-created object that we previously initialized is lost because it's out of scope and nobody has a reference to it anymore.
It's not a very common use case to return a different object from its constructor function, but it might make sense in certain scenarios. For example, in a development environment, we could wrap the returned object in a proxy and alert developers whenever they use that object incorrectly.