DEV Community

Saloni Yadav
Saloni Yadav

Posted on • Edited on

6

Re-introducing JavaScript Objects using Constructor Function

Previously we had seen JavaScript's Object Literal method of creating an object. In this post, we will explore how to create an object using the Constructor Function. Yes, that's right. You can create an object using a function!

For those of you familiar with Classes and instantiating an object from a class, this concept is very similar.

Then why don't we just create a class??
Surprisingly, classes were introduced in JS only with ES6 (ECMAScript2015), which is quite recent. Sigh! Until then, Constructor Function was our savior. (Don't worry if you don't know what I am talking about.)

Having said that, let's dive in:

We will use the same object format we used in #1 post for our example. Here it is,



function Person(thename) {
    this.name = thename; 
    this.greeting = function() {
        console.log('Hola! Mi nombre es ' + this.name + '.');
    }
}


Enter fullscreen mode Exit fullscreen mode

PS. I have dropped the age and country attributes just to keep it simple.

This creates a function "object" with a namespace Person, within which there are two attributes called name (of string type) and greeting (of function type).
Internally, JS converts this code into an Immediately-Invoked Function Expression and allocates a variable Person of type - function object. We will learn about IIFE later, let's keep it simple for now.

Note- The CAPITAL 'P' used while declaring 'Person' is nothing but a common naming convention for anything that resembles a Class. If you are using any modern code editor like VSCode with ES6 JS version, you will notice a warning like:
"This constructor function may be converted to a class declaration."

Remember, we haven't created an object yet. We have only defined what the object should look like. Now, to create an object, simply call the function like a constructor:

person1 = new Person('Sanchez');

This creates a new object called person1. Go ahead and print person1 in your console using console.log(person1) and dissect it. Open it until you have reached trivia. You will see something like this (and a lot more):



/**
 * {
 *  name: 'Sanchez',
 *  greeting: f (), --> no name to the function - anonymous function
 *  __proto__: {
 *      constructor: f Person(thename), --> name of the function "Person"
 *      __proto__: Object
 *  }
 * }
 */


Enter fullscreen mode Exit fullscreen mode

Alt Text

What is actually happening here?

We can break it down to three steps:

  1. new creates a new empty object and assigns it to this -> this = {}
  2. The function then runs and adds new key-value pairs to this object -> this.name = thename and this.greeting = function() {...}
  3. Finally, the value of this is returned and assigned to person1 -> person1 = function () {... return this; }

Note- In this case, your constructor function should NOT have any return statement. JS won't stop you from adding one. If you do, that return statement will be executed and the corresponding object will be returned instead of this and the instantiation will work differently than you anticipate. So be careful!

But what is this ugly wormy thing that creeped into your object called __proto__!! This is JavaScript's Object Prototypes. It's an amazing and equally important concept for us to master Objects in JS. We will get to them soon!
For now, stash them in your memory palace.

When do we use Constructor Functions?

Take a scenario where you just know you are going to have Objects of 'Person' type, but don't know HOW MANY. Here, it is simply convenient to call var newguy = new Person('His Name') everytime you encounter a need for new object, instead of creating them using the verbose method of Object Literal.

But this can't be all so perfect, can it?

Think about this...
Everytime you create a new object from Person, a new variable is getting assigned in the memory with an object reference. And EVERY object contains a function called greeting which is essentially doing the same thing in all the objects. If you have 10 such object, 50... 100... How many times do we define the same function for every object!!

We have solution to this extravagant waste of space. šŸŽ¶šŸŽµ #SuspenseMusic ...
Prototypes.
Whaaaaaa.... 😱
Anyways, let's not overload ourselves. If you have made it this far, treat yourself with some šŸ¦. Take a break. Then move on to #3.

PS: Before you move on to the next chapter. I would suggest you play around with this a bit. Create new functions. Instantiate new objects. Open them up. Open what's openable inside of them. Keep going. I promise, it's fun! Comment here some interesting things you see.

Also, I will soon add some JS Interview kind of questions to help you grasp the usage of these concepts soon. Hang in there!

Reference:
https://javascript.info/constructor-new#constructor-function
https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Object-oriented_JS

Heroku

Built for developers, by developers.

Whether you're building a simple prototype or a business-critical product, Heroku's fully-managed platform gives you the simplest path to delivering apps quickly — using the tools and languages you already love!

Learn More

Top comments (0)

Image of Stellar post

Check out Episode 1: How a Hackathon Project Became a Web3 Startup šŸš€

Ever wondered what it takes to build a web3 startup from scratch? In the Stellar Dev Diaries series, we follow the journey of a team of developers building on the Stellar Network as they go from hackathon win to getting funded and launching on mainnet.

Read more

šŸ‘‹ Kindness is contagious

Engage with a wealth of insights in this thoughtful article, valued within the supportive DEV Community. Coders of every background are welcome to join in and add to our collective wisdom.

A sincere "thank you" often brightens someone’s day. Share your gratitude in the comments below!

On DEV, the act of sharing knowledge eases our journey and fortifies our community ties. Found value in this? A quick thank you to the author can make a significant impact.

Okay