Okay, let's look at an example ie the one that's titled foo is now a constructor. So on line 49, I have the Foo function. But you may notice that I've used a capital F when I named foo, not just lowercase fo but capital fo and that doesn't essentially change anything. But it's a convention that most programmers use that you want to capitalize the first letter of a function when you want it to be a constructor. And I do want it to be constructed because on line 56, I'm not just executing foo, I'm instantiating. It I'm saying var foo equals new foo.
And if you've worked with constructor func constructor functions in all JavaScript, you know that when you instantiate a constructor, you do execute it. So foo will be executed. But it's a little bit different because bar, the value bar winds up being the instance of the Foo class. foo is essentially acting as a class here. In bar is going to get an instance of the class. So inside of our controller After I create a speed variable to private to that constructor, and I alert this dot speed.
So let's execute this code in our console. And we'll see what what happens. So I alert it and I get undefined. Why is that? Well, if we go back to the code, will I, my first thought might have been that, well, I create the speed variable. So when I'm instantiating, foo, shouldn't the execution of food produce an instance of foo?
Well, it should. But the problem is that you may think that the word this references the instance of foo, and it does, it's true through the bar. This equals bar meaning that when you instantiate foo using bar, this keyword inside of the constructor references the instance has been returned so that that's true, but speed is not a problem. of the constructor. It's a variable. And that's one of the areas where scope and context can feel like the same thing.
But in this case, they're very much not the same thing. Speed is a variable when you think variables you think scope. But in this case, we're, we're trying to reference a we're trying to reference the speed property of this variable. But of this instance, but the instance doesn't have a speed variable. It has a speed doesn't have a speed property has a speed variable. So this dot speed is essentially undefined.
If I were to say let's see. Let's see return. Speed 5000. And then I alert bar dot speed. This should work. So let's copy this code and paste it and we get 5000.
The reason we get 5000 is because now the class food does have a screen Property Bar winds up with speed property. In fact, if I were to do a console d'oeuvre I will just type bar and in the console, I see I get an object with a speed property. So in that case, it would work. Now, the instance of food does have a speed property. Another way to do this would be if I wanted to keep the alert inside the constructor, I could say foo dot pro prototype, dot speed equal So let's say 10,000, just to prove our case here, so I'm gonna refresh the page. And oops, I should have said that.
See, there you go, typo. Okay, so let's refresh the page. And now I get 10,000. And the reason is because even though I don't declare a speed property when I create the constructor, as soon as I create the constructor, I create a speed property on the prototype object. Now, prototyping is again, that's that's, that's fuel for a whole nother class. But the point here is that I'm extending the constructor here, with I'm giving it a prototype aren't giving putting up a speed property on its prototype object, which means that when I instantiate foo bar will have a speed property.
So this dot speed does resolve to 10,000 So, but the original question did not have a prototype and it the reason why we got undefined is because this class constructor has a speed variable but not a speed property.