What is a prototype?
Almost every object is linked to another object. That linked object is called the prototype.
It’s a native property, meaning we don't have to set it ourselves.
This way you can get an object of class Person with the name property e.g. Kacper.
Then, we can refer to the constructor using the prototype property built into each class. This way, we can generate a new object of the Person class with the name property Mark.
Prototype in a class
We can refer to the class constructor using a property built into each instance object - __proto__. This is the same as the prototype in classes. 🧐
Prototype & __proto__
In the prototype of the Person class there is the Person class constructor.
And now let’s check kacper.__proto__
We can see that __proto__ and the prototype of the class both contain the Person class constructor. That's because __proto__ and prototype are actually the same thing but are named differently depending where you access them from - on a class or an object level.
Below is a graph with the connections between prototype, __proto__, class, and object explained.
If we add something to kacper.__proto__ then all other objects in the class will have it ( in their __proto__ )!
Now, when we go into kacper.__proto__ we’ll see:
and when we go into pawel.__proto__ or mark.__proto__ , we’ll see:
As you can notice, it’s only visible in the prototype of the class!
Whereas in the body of the class we see only the name property, and no age property, which means we can create methods that can be secretly called by objects.
That’s how we’ll secretly call the tellSecret method!
However, according to the specification, we shouldn't use it this way, I just wanted to show how it's all interconnected!
You can also get to kacper.__proto__ using
or to set a prototype for an object
Remember that using this in code spoils the optimization of the application because operating on prototypes is VERY slow.
``` obj.__proto__ = … ``` effects affect any piece of code that references any property of an object whose ```[[Prototype]]``` has been changed.
If you want to keep the highest level of performance you should avoid this operation.
Good luck & thanks for your attention,