Difference between: `function Person(){}`, `const person = Person()`, and `const person = new Person()` in JavaScript?
TL;DR
function Person(){}: A function declaration in JavaScript. It can be used as a regular function or as a constructor.const person = Person(): CallsPersonas a regular function, not a constructor. IfPersonis intended to be a constructor, this will lead to unexpected behavior.const person = new Person(): Creates a new instance ofPerson, correctly utilizing the constructor function to initialize the new object.
| Aspect | function Person(){} | const person = Person() | const person = new Person() | 
|---|---|---|---|
| Type | Function declaration | Function call | Constructor call | 
| Usage | Defines a function | Invokes Person as a regular function | Creates a new instance of Person | 
| Instance Creation | No instance created | No instance created | New instance created | 
| Common Mistake | N/A | Misusing as constructor leading to undefined | None (when used correctly) | 
Function declaration
function Person(){} is a standard function declaration in JavaScript. When written in PascalCase, it follows the convention for functions intended to be used as constructors.
function Person(name) {this.name = name;}
This code defines a function named Person that takes a parameter name and assigns it to the name property of the object created from this constructor function. When the this keyword is used in a constructor, it refers to the newly created object.
Function call
const person = Person() simply invoke the function's code. When you invoke Person as a regular function (i.e., without the new keyword), the function does not behave as a constructor. Instead, it executes its code and returns undefined if no return value is specified and that gets assigned to the variable intended as the instance. Invoking as such is a common mistake if the function is intended to be used as a constructor.
function Person(name) {this.name = name;}const person = Person('John'); // Throws error in strict modeconsole.log(person); // undefinedconsole.log(person.name); // Uncaught TypeError: Cannot read property 'name' of undefined
In this case, Person('John') does not create a new object. The person variable is assigned undefined because the Person function does not explicitly return a value. Attempting to access person.name throws an error because person is undefined.
Constructor call
const person = new Person() creates an instance of the Person object using the new operator, which inherits from Person.prototype. An alternative would be to use Object.create, such as: Object.create(Person.prototype) and Person.call(person, 'John') initializes the object.
function Person(name) {this.name = name;}const person = new Person('John');console.log(person); // Person { name: 'John' }console.log(person.name); // 'John'// Alternativeconst person1 = Object.create(Person.prototype);Person.call(person1, 'John');console.log(person1); // Person { name: 'John' }console.log(person1.name); // 'John'
In this case, new Person('John') creates a new object, and this within Person refers to this new object. The name property is correctly set on the new object. The person variable is assigned the new instance of Person with the name property set to 'John'. And for the alternative object creation, Object.create(Person.prototype) creates a new object with Person.prototype as its prototype. Person.call(person, 'John') initializes the object, setting the name property.
Follow-Up Questions
- What are the differences between function constructors and ES6 class syntax?
 - What are some common use cases for 
Object.create?