Hello everyone,
I trust my post finds you well and healthy.
I'm not a posting person, but I'm tired of trying to understand in simple terms what ...
For further actions, you may consider blocking this person and/or reporting abuse
I'll give you the low-down on
classes
in JavaScript andclasses
in traditional OOP languages, say Python.Traditional OOP languages
In traditional OOP languages, a
class
is a blueprint for objects. In terms of information management, the class is used to provide a) abstraction (which information is relevant? which is irrelevant?) and b) encapsulation (how do I hide/show what is relevant/irrelevant?). Through a class, I can create multiple implementations of this blueprint. These implementations are calledinstances
. Each instance gets a copy of themethods
andinstance variables
of the class.In this example,
person_a
andperson_b
areinstances
of the blueprint (read: class)Person
. Each of them gets its ownfirst_name
andlast_name
instance variables, andprint_full_name
method.JavaScript
Now JavaScript, while seemingly does the same thing, does this differently. Whenever we use the
new
keyword to execute a function, we create an implicit object that we can reference withthis
inside the function. Furthermore, objects created with a constructor function have a reference to the constructor function inside their own prototypes. That was a lot. Let's try to unpack this with code.Let's first make an object without any fancy constructor functions:
This works fully well. Why not call it a day and be done with it?
The brutally honest truth is, we can call it a day and be done with it. There are a lot of use cases that you can accomplish by just creating objects this way. But just because we can, doesn't mean we should, especially if there are arguably better ways of accomplishing the same thing. If we proceed with this route, we're not taking advantage of the prototypical inheritance that makes JavaScript unique (not necessarily better nor worse).
Let's take a look at another way we can implement this:
As I mentioned earlier, there are two things that are happening whenever we use the
new
keyword.An implicit object is created and is referred to as
this
. So, when we dothis.firstName
orthis.lastName
, it's as if we're assigning properties to an empty object.Objects created with a constructor function have a reference to the constructor function inside their own prototypes. After creating the constructor function above and its instances, try to type the following in your browser console:
Whenever we create a new
instance
of thePerson
constructor function through thenew
keyword, a reference to theprototype
object of theconstructor function
gets added to the__proto__
property of the object. Read that again. After that, read it one more time. This bit is important.As opposed to traditional OOP languages, methods are not copied to each
instance
of the class. When we callperson_a.fullName()
, JavaScript climbs up the__proto__
properties of the instances until it finds a qualified name offullName()
. Therefore, the methodfullName()
lives completely inside theprototype
of theconstructor function
. This provides performance benefits since the methods only have to be defined once (on the prototype). That is,person_a.fullName === person_b.fullName === Person.prototype.fullName
.This means that whatever we define on
Person.prototype
will be available to all instances ofPerson
. So we can do something weird (in traditional OOP sense) like this:I hope that this clears everything up. To summarize:
this
, and assign the__proto__
property of each instance as a reference to theprototype
object of theconstructor function
prototype chain
is climbed until a reference to the function is foundI didn't include a bit about inheritance. But I think that this information is enough to get you to understand it on your own.
A note about ES6 "classes"
Syntactic sugar. It's quite cumbersome to write
prototype
for each method you want to share amongst instances (in addition to breaking encapsulation at the textual level). ES6 class syntax is just an easy way to store everything in one place, without having to mess withprototype
and all of that jazz.I hope this was helpful.
Cheers,
Adrian
Thank you so much for taking the time to write this reply. As Daniel mentioned, this deserve its own post. I'm sorry I didn't reply before, but I live among persistent distractions and internet issues. Thank you so much. I'm reviewing it now!
I am seeing on 26-04-2025, and I am grateful for your response. Thank you very much!
Years later this response have helped me so much. Thank you so much Adrian.
Adrian, nice! 👍 I once read an entire book in order to learn what you just covered in this comment.
Feel free to paste this comment into a whole new post, since it sure is worth it's own post on DEV!
Wow! Thanks for the nice comment, Daniel! Working on its own post right now. Look out for it!
Trying to find differences between these might answer your question
function
keywordIt isn't always distinguishable between functions and class constructor... I have tried to distinguish these programmatically before -- github.com/patarapolw/any-serializ...
Thanks for the link. Checking it out.
Thanks for taking the time to reply and sorry for the late response :D
This is not a direct answer to your question, but JavaScript is a very odd language with a lot of confusing quirks - probably because it was originally thrown together over literally just a few days. Over the years, people have tried to cover up these idiosyncrasies with additional syntax to make the language at least feel closer to something like Java or C#. Unfortunately, these similarities are rather superficial, so you have to be careful to really understand what's going on to avoid some common bugs that can arise from using the language in the same way that you would in Java or C#. In your position, as someone who doesn't know Java, C# or similar languages, that adds up to even more confusion...
So, what to do? My suggestion is to not worry too much about the details of this stuff right now. Learn from tutorials that focus on specific programming tasks, like creating and processing a form, or drawing things on the screen, or even basic math and data structure manipulations.
As time goes on and you learn how to do practical things, hopefully you will feel empowered to understand a bit more about how things work.
Thanks. I've been told something similar from someone else. It just really bothers me to move on without really understanding what's going on. I think eventually I will have to. Thanks for taking the time to reply!
Learn the 'oops concepts' of JAVA, with practical examples .