Reputation: 623
I'm studying prototypes right now and think that I'm almost there but I'm a bit confused on one topic.
Let's say we have:
function Animal(name, gender) {
this.name = name;
this.gender = gender;
}
function Cat(species) {
this.species = species;
}
Cat.prototype.color = null;
Cat.prototype = new Animal();
My question is, why is prototype
needed at all for new properties?
Why couldn't we do:
Cat.color = null;
EDIT::
All the white blocks are from a uml diagram from another SO post. I added the orange boxes to suit this example that I've provided. Does this diagram I've added to still make sense?
My main problem I believe is that I was making the function constructors and the actual prototype objects too similar when in fact they're completely different things. One's a function and one's an object.
EDIT 2
With this diagram, I'm trying to clarify how the constructor
property interacts and what it is exactly connected to, and more specifically, how it affects the use of this
. Any comments on the validity would help.
Upvotes: 0
Views: 87
Reputation: 649
"Everything in Javascript is an Object"
Ever wonder why you can use .toString()
on say the number 50 without having written Number.toString = function(){....?
Because it's built-into Javascript. All Number.prototypes have the .toString
method. And the list goes on for Arrays, Objects, Strings, etc.
Every time you write a Number in JS, imagine (no constructor is really called) calling a Number constructor function similar to your constructor functions for Animal & Cat.
That's what constructor functions do. They create an instance of (theirname).prototype. That's why function Animal()
makes something of Animal.prototype
and so on.
function Animal()
and function Cat()
otherwise have nothing to do with Animal.prototype
and Cat.prototype
. If you actually made a new Animal with new Animal()
and then changed the constructor, the new Animal you just made wouldn't be updated, because it was constructed before the constructor changed.
Let's say you make a Cat
"Hobbes"
Then after that, when you say Cat.prototype.color = null;
, you're saying all objects of Cat.prototype should have a 'null' value for color. This will update Cats you constructed before, since now when you try to find Hobbe's color, it will spit undefined
since you didn't give a color to Hobbes himself in function Cat()
, but then JS will backtrack to Hobbe's Cat.prototype
and find that color is actually null
.
Hope that helps.
Upvotes: 1
Reputation: 26161
Several things to remind;
this.
keyword then those will be the properties of the instantiated object. The variables defined with preceding var keyword won't be a part of the instantiated object.this.
in the constructor. Such as this.name
or this.color
however the functionalities that they are expected to share should be defined in the constructors prototype since obviously it would be a waste of memory to reserve a room for them within each instantiated object.Upvotes: 1
Reputation: 13888
Good question:
Cat.color = null
; sets the color only on that one Cat
, if you put it on the prototype
any 'Cat
' you instantiate afterwards will also contain a color
property.
Lets say you have something like var tabby = new Cat('feline')
with the code above it without the prototype
tabby
won't have a color
.
Upvotes: 2