1
00:00:01,080 --> 00:00:02,040
<v Instructor>Now it's time</v>

2
00:00:02,040 --> 00:00:05,040
to finally start using prototypes.

3
00:00:05,040 --> 00:00:07,180
And after this, you will feel

4
00:00:07,180 --> 00:00:09,340
like a real pro developer,

5
00:00:09,340 --> 00:00:10,173
believe me.

6
00:00:12,000 --> 00:00:14,550
And we're gonna continue with the example

7
00:00:14,550 --> 00:00:16,063
from the previous video.

8
00:00:17,690 --> 00:00:18,570
Okay.

9
00:00:18,570 --> 00:00:22,880
But now we're gonna talk about prototypes.

10
00:00:22,880 --> 00:00:25,650
So actually, we talked about prototypes,

11
00:00:25,650 --> 00:00:30,420
prototypal inheritance and delegation earlier already.

12
00:00:30,420 --> 00:00:34,020
But how does all of that actually work?

13
00:00:34,020 --> 00:00:37,650
Well, it can be summarized like this.

14
00:00:37,650 --> 00:00:41,600
So, first each and every function in JavaScript

15
00:00:41,600 --> 00:00:45,550
automatically has a property called prototype.

16
00:00:45,550 --> 00:00:49,140
And that includes, of course, constructor functions.

17
00:00:49,140 --> 00:00:51,500
Now every object that's created

18
00:00:51,500 --> 00:00:53,840
by a certain constructor function

19
00:00:53,840 --> 00:00:57,420
will get access to all the methods and properties

20
00:00:57,420 --> 00:01:01,830
that we define on the constructors prototype property.

21
00:01:01,830 --> 00:01:03,260
So just to visualize

22
00:01:04,170 --> 00:01:05,003
in our case,

23
00:01:05,003 --> 00:01:08,637
this would be person dot prototype.

24
00:01:10,980 --> 00:01:13,440
So the prototype property

25
00:01:13,440 --> 00:01:15,880
of the constructor function.

26
00:01:15,880 --> 00:01:18,750
So again, as I was just saying,

27
00:01:18,750 --> 00:01:21,210
all the objects that are created

28
00:01:21,210 --> 00:01:23,850
through this constructor function here

29
00:01:23,850 --> 00:01:25,270
will inherit,

30
00:01:25,270 --> 00:01:26,850
so they will get access

31
00:01:26,850 --> 00:01:28,920
to all the methods and properties

32
00:01:28,920 --> 00:01:32,383
that are defined on this prototype property.

33
00:01:33,320 --> 00:01:35,900
And so let's no actually add a method

34
00:01:35,900 --> 00:01:37,503
to this prototype property.

35
00:01:38,710 --> 00:01:41,420
And so, this is actually an object.

36
00:01:41,420 --> 00:01:44,120
And so we can now say calcAge

37
00:01:46,290 --> 00:01:48,280
and then we can simply set it

38
00:01:48,280 --> 00:01:50,153
to this same function here,

39
00:01:52,550 --> 00:01:56,723
so equal, and that's it.

40
00:01:58,050 --> 00:02:00,510
Now we get some error here

41
00:02:00,510 --> 00:02:04,850
and that's because I misspelled prototype.

42
00:02:04,850 --> 00:02:07,423
So that's type right here.

43
00:02:08,840 --> 00:02:10,930
And then let's actually take a look

44
00:02:10,930 --> 00:02:13,470
at his prototype property

45
00:02:13,470 --> 00:02:15,053
just for curiosity.

46
00:02:19,200 --> 00:02:22,373
So that's not comma, of course, it's the dot.

47
00:02:23,900 --> 00:02:27,110
And so here is that prototype property.

48
00:02:27,110 --> 00:02:28,610
And so you see that right now

49
00:02:28,610 --> 00:02:32,490
we already have the calcAge method in there.

50
00:02:32,490 --> 00:02:35,990
So before it was kind of an empty object

51
00:02:35,990 --> 00:02:39,450
so nevermind these two here.

52
00:02:39,450 --> 00:02:42,010
So basically it was empty before

53
00:02:42,010 --> 00:02:44,700
but now there is the calcAge method

54
00:02:44,700 --> 00:02:46,400
already in here,

55
00:02:46,400 --> 00:02:48,653
so this one that we just defined down here.

56
00:02:50,010 --> 00:02:51,160
Alright.

57
00:02:51,160 --> 00:02:53,950
And once again, remember how I said

58
00:02:53,950 --> 00:02:56,190
that each object created

59
00:02:56,190 --> 00:02:58,220
by this constructor function

60
00:02:58,220 --> 00:03:00,670
will now get access to all the methods

61
00:03:00,670 --> 00:03:03,110
of this prototype property.

62
00:03:03,110 --> 00:03:04,160
And so of course,

63
00:03:04,160 --> 00:03:06,110
also to calcAge.

64
00:03:06,110 --> 00:03:08,923
And so we should be able to do this.

65
00:03:10,030 --> 00:03:13,160
So Jonas, which is this object here

66
00:03:13,160 --> 00:03:14,970
which was of course created

67
00:03:14,970 --> 00:03:16,823
by this constructor function.

68
00:03:18,290 --> 00:03:19,713
And so, calcAge.

69
00:03:20,890 --> 00:03:22,760
And let's see.

70
00:03:22,760 --> 00:03:26,320
And indeed, we get to the correct age here.

71
00:03:26,320 --> 00:03:28,110
So it worked.

72
00:03:28,110 --> 00:03:29,350
Great.

73
00:03:29,350 --> 00:03:30,960
That's amazing.

74
00:03:30,960 --> 00:03:34,190
So we can now use this method here

75
00:03:34,190 --> 00:03:35,850
on the Jonas object

76
00:03:35,850 --> 00:03:38,020
even though it is not really

77
00:03:38,020 --> 00:03:40,630
on the object itself, right?

78
00:03:40,630 --> 00:03:42,433
So if we check our Jonas here,

79
00:03:43,690 --> 00:03:46,350
then you see that it contains of course

80
00:03:46,350 --> 00:03:48,830
the birth year and the first name,

81
00:03:48,830 --> 00:03:52,340
but it does not contain the calcAge method.

82
00:03:52,340 --> 00:03:54,640
But still, we have access to it

83
00:03:54,640 --> 00:03:57,163
because of prototypal inheritance.

84
00:03:58,240 --> 00:03:59,750
Okay.

85
00:03:59,750 --> 00:04:01,650
And of course the same is gonna work

86
00:04:01,650 --> 00:04:03,500
for Matilda here,

87
00:04:03,500 --> 00:04:07,320
and of course, also for the Jack object.

88
00:04:07,320 --> 00:04:08,730
Beautiful.

89
00:04:08,730 --> 00:04:12,720
So that effectively solves this problem

90
00:04:12,720 --> 00:04:13,960
that we had before

91
00:04:13,960 --> 00:04:16,160
when we added the calcAge method

92
00:04:16,160 --> 00:04:20,490
directly to each of the objects, remember that?

93
00:04:20,490 --> 00:04:23,070
So here we would have created a copy

94
00:04:23,070 --> 00:04:24,610
of this method here

95
00:04:24,610 --> 00:04:27,750
and attached it to every single object.

96
00:04:27,750 --> 00:04:30,350
And so that's why we don't do this.

97
00:04:30,350 --> 00:04:32,880
Instead, what we do is this.

98
00:04:32,880 --> 00:04:35,940
Because now there exists only one copy

99
00:04:35,940 --> 00:04:37,800
of this function.

100
00:04:37,800 --> 00:04:39,840
So only one of them exists,

101
00:04:39,840 --> 00:04:43,190
but then all of the objects that are created

102
00:04:43,190 --> 00:04:45,380
using this constructor function

103
00:04:45,380 --> 00:04:47,850
can basically reuse this function

104
00:04:47,850 --> 00:04:49,460
on themselves.

105
00:04:49,460 --> 00:04:51,010
And so, the disc keyword,

106
00:04:51,010 --> 00:04:53,220
of course, in each of them

107
00:04:53,220 --> 00:04:55,740
is as always set to the object

108
00:04:55,740 --> 00:04:57,560
that is calling the method.

109
00:04:57,560 --> 00:04:59,030
And so here that's Jonas

110
00:04:59,030 --> 00:05:01,480
and here that's gonna be Matilda.

111
00:05:01,480 --> 00:05:03,460
So just like we learned previously,

112
00:05:03,460 --> 00:05:06,330
the disc keyword is set to the object

113
00:05:06,330 --> 00:05:08,030
that is calling the method.

114
00:05:08,030 --> 00:05:08,990
Now right.

115
00:05:08,990 --> 00:05:11,960
So, in a nutshell, this is how we implement

116
00:05:11,960 --> 00:05:14,430
very basic prototypal inheritance

117
00:05:14,430 --> 00:05:16,920
in JavaScript and practice.

118
00:05:16,920 --> 00:05:19,900
So we just observed, that the Jonas

119
00:05:19,900 --> 00:05:21,960
and the Matilda objects

120
00:05:21,960 --> 00:05:26,600
are kind of somehow connected to the person, right?

121
00:05:26,600 --> 00:05:30,120
That's why they can have access to these methods

122
00:05:30,120 --> 00:05:32,470
or in this case to just this method

123
00:05:32,470 --> 00:05:37,040
that is located inside the prototype property of person.

124
00:05:37,040 --> 00:05:40,770
But how and why does this actually work?

125
00:05:40,770 --> 00:05:43,870
Well, it works because any object always

126
00:05:43,870 --> 00:05:46,820
has access to the methods and properties

127
00:05:46,820 --> 00:05:48,980
from its prototype.

128
00:05:48,980 --> 00:05:51,790
And the prototype of Jonas and Matilda

129
00:05:51,790 --> 00:05:53,993
is person dot prototype.

130
00:05:55,050 --> 00:05:57,290
And we can actually confirm that

131
00:05:57,290 --> 00:06:00,450
because each object has a special property

132
00:06:00,450 --> 00:06:03,513
called a underscore underscore proto.

133
00:06:04,820 --> 00:06:05,943
So like this.

134
00:06:06,840 --> 00:06:09,800
Underscore underscore proto

135
00:06:09,800 --> 00:06:12,910
and then again, underscore underscore.

136
00:06:12,910 --> 00:06:15,233
So this looks a bit weird, but,

137
00:06:16,378 --> 00:06:18,660
and this is just kind of how it works.

138
00:06:18,660 --> 00:06:20,550
So let's take a look.

139
00:06:20,550 --> 00:06:24,390
And so this is the prototype of Jonas.

140
00:06:24,390 --> 00:06:26,520
It's not the prototype property

141
00:06:26,520 --> 00:06:30,020
but it is simply the prototype, okay?

142
00:06:30,020 --> 00:06:33,010
And so here again, we see the calcAge function

143
00:06:33,010 --> 00:06:36,510
and that's why Jonas is able to use this.

144
00:06:36,510 --> 00:06:39,270
So to prototype of the Jonas object

145
00:06:39,270 --> 00:06:42,210
is essentially the prototype property

146
00:06:42,210 --> 00:06:43,893
of the constructor function.

147
00:06:44,920 --> 00:06:48,073
So let's quickly see that as well.

148
00:06:49,490 --> 00:06:51,663
So we can check that.

149
00:06:52,560 --> 00:06:55,510
So person dot prototype.

150
00:06:55,510 --> 00:06:57,690
And so this should not be true,

151
00:06:57,690 --> 00:06:59,523
and indeed it is.

152
00:07:00,460 --> 00:07:01,570
All right?

153
00:07:01,570 --> 00:07:03,590
But what I just said

154
00:07:03,590 --> 00:07:07,140
sounded incredibly confusing, didn't it?

155
00:07:07,140 --> 00:07:09,900
So shouldn't person dot prototype

156
00:07:09,900 --> 00:07:12,530
be the prototype of person,

157
00:07:12,530 --> 00:07:13,363
I mean

158
00:07:13,363 --> 00:07:15,450
should this prototype property here

159
00:07:15,450 --> 00:07:19,110
not be the prototype of person?

160
00:07:19,110 --> 00:07:21,530
Well, actually, no.

161
00:07:21,530 --> 00:07:24,280
So this is the confusing part.

162
00:07:24,280 --> 00:07:26,440
So person dot prototype here

163
00:07:26,440 --> 00:07:30,040
is actually not the prototype of person.

164
00:07:30,040 --> 00:07:33,600
But instead, it is what's gonna be used

165
00:07:33,600 --> 00:07:36,410
as the prototype of all the objects

166
00:07:36,410 --> 00:07:40,290
that are created with the person constructor function.

167
00:07:40,290 --> 00:07:43,420
So that's a subtle but important difference

168
00:07:43,420 --> 00:07:45,620
that you need to keep in mind.

169
00:07:45,620 --> 00:07:48,180
And, in fact, what I just said

170
00:07:48,180 --> 00:07:51,340
that is confirmed by this comparison

171
00:07:51,340 --> 00:07:53,020
that we just did here.

172
00:07:53,020 --> 00:07:57,110
So we just saw that Jonas's prototype

173
00:07:57,110 --> 00:07:59,800
which is this, is the prototype property

174
00:07:59,800 --> 00:08:02,870
of the person constructor function.

175
00:08:02,870 --> 00:08:05,450
And there are actually other built in methods

176
00:08:05,450 --> 00:08:07,533
that we can use to prove this.

177
00:08:10,010 --> 00:08:11,670
So on any object,

178
00:08:11,670 --> 00:08:15,000
for example, object dot prototype,

179
00:08:15,000 --> 00:08:19,220
we can test if this is a prototype of another object.

180
00:08:19,220 --> 00:08:21,713
So we can call is prototype,

181
00:08:24,600 --> 00:08:28,300
so is prototype

182
00:08:28,300 --> 00:08:33,300
like this of and then Jonas.

183
00:08:34,220 --> 00:08:37,000
And so this should also become true.

184
00:08:37,000 --> 00:08:39,100
And indeed it is.

185
00:08:39,100 --> 00:08:41,490
So this confirms one more time

186
00:08:41,490 --> 00:08:43,740
that person dot prototype

187
00:08:43,740 --> 00:08:47,730
is indeed the prototype of Jonas.

188
00:08:47,730 --> 00:08:52,420
And the same for Matilda, of course as well.

189
00:08:52,420 --> 00:08:54,222
But person dot prototype

190
00:08:54,222 --> 00:08:56,883
is not the prototype of person.

191
00:08:59,130 --> 00:09:01,193
So you see, it is false here.

192
00:09:02,840 --> 00:09:05,420
So, this very common confusion

193
00:09:05,420 --> 00:09:09,823
comes from bad naming of this property.

194
00:09:10,830 --> 00:09:13,270
So the fact that it's called prototype

195
00:09:13,270 --> 00:09:17,690
kind of implies that this is the prototype of person,

196
00:09:17,690 --> 00:09:21,310
but as we just learned, it is actually not.

197
00:09:21,310 --> 00:09:23,470
Probably shouldn't be called prototype

198
00:09:23,470 --> 00:09:28,470
but instead something like prototype of linked objects

199
00:09:29,380 --> 00:09:30,563
or something like this.

200
00:09:33,270 --> 00:09:34,800
So if this makes it easier

201
00:09:34,800 --> 00:09:37,310
you can think of the prototype property

202
00:09:37,310 --> 00:09:41,660
as prototype of linked objects property.

203
00:09:41,660 --> 00:09:44,970
Even though of course it's not called like this,

204
00:09:44,970 --> 00:09:48,400
but this would be a more honest name.

205
00:09:48,400 --> 00:09:50,930
So take some time to really understand

206
00:09:50,930 --> 00:09:54,823
what the prototype of what object actually is here.

207
00:09:55,740 --> 00:09:59,620
Now, anyway, where does this proto,

208
00:09:59,620 --> 00:10:02,040
property here, on the Jonas object

209
00:10:02,040 --> 00:10:03,880
actually come from?

210
00:10:03,880 --> 00:10:07,250
Well, remember the new operator

211
00:10:07,250 --> 00:10:08,723
that we talked about before,

212
00:10:09,610 --> 00:10:12,760
well, it contains this step number three

213
00:10:12,760 --> 00:10:15,310
which links the empty new object

214
00:10:15,310 --> 00:10:17,120
to the prototype.

215
00:10:17,120 --> 00:10:20,510
And so basically, it is this step number three

216
00:10:20,510 --> 00:10:24,500
which will create this proto property.

217
00:10:24,500 --> 00:10:27,220
So it creates this proto property

218
00:10:27,220 --> 00:10:31,040
and it sets its value to the prototype property

219
00:10:31,040 --> 00:10:33,440
of the function that is being called.

220
00:10:33,440 --> 00:10:37,720
And so that's exactly what is written here, right?

221
00:10:37,720 --> 00:10:40,360
So again, it sets the proto property

222
00:10:40,360 --> 00:10:43,980
on the object to the prototype property

223
00:10:43,980 --> 00:10:47,360
of the constructor function.

224
00:10:47,360 --> 00:10:50,400
And so this is how JavaScript knows internally

225
00:10:50,400 --> 00:10:52,890
that the Jonas object is connected

226
00:10:52,890 --> 00:10:54,653
to person dot prototype.

227
00:10:55,570 --> 00:10:57,640
And in fact, when we check out

228
00:10:57,640 --> 00:10:59,980
the Jonas object here

229
00:10:59,980 --> 00:11:03,690
we can indeed also see that property in here.

230
00:11:03,690 --> 00:11:05,780
So it's also right here,

231
00:11:05,780 --> 00:11:07,870
and if we open that up,

232
00:11:07,870 --> 00:11:10,830
then you see exactly person dot prototype

233
00:11:10,830 --> 00:11:15,310
which contains this calcAge function, all right?

234
00:11:15,310 --> 00:11:17,530
So I'm spending a lot of time here

235
00:11:17,530 --> 00:11:19,040
for you to really understand

236
00:11:19,040 --> 00:11:21,610
what this proto property here is

237
00:11:21,610 --> 00:11:24,570
and what the prototype of the constructor is

238
00:11:24,570 --> 00:11:26,580
and how they are all linked

239
00:11:26,580 --> 00:11:29,870
because this is one of the most important things,

240
00:11:29,870 --> 00:11:32,210
and also one of the most difficult things

241
00:11:32,210 --> 00:11:34,590
to understand in JavaScript.

242
00:11:34,590 --> 00:11:37,710
But I hope that it's becoming increasingly clear

243
00:11:37,710 --> 00:11:40,010
and there will also be a couple of diagrams

244
00:11:40,010 --> 00:11:42,610
in the next video that will basically

245
00:11:42,610 --> 00:11:44,670
bring all this knowledge together

246
00:11:44,670 --> 00:11:46,623
in an easier to understand way.

247
00:11:47,690 --> 00:11:50,400
So, by now you're probably sick

248
00:11:50,400 --> 00:11:52,730
of hearing the word prototype

249
00:11:52,730 --> 00:11:55,073
but I just wanted to quickly show you

250
00:11:55,073 --> 00:11:58,840
that we can also set properties on the prototype.

251
00:11:58,840 --> 00:12:01,170
And so not just methods.

252
00:12:01,170 --> 00:12:04,403
So let's say person dot prototype,

253
00:12:05,260 --> 00:12:06,573
dot species,

254
00:12:07,520 --> 00:12:09,010
and so this is something

255
00:12:09,010 --> 00:12:10,897
that all of the objects here

256
00:12:10,897 --> 00:12:13,260
will have in common,

257
00:12:13,260 --> 00:12:15,273
and so that's Homo Sapiens.

258
00:12:17,780 --> 00:12:18,613
Now, right?

259
00:12:18,613 --> 00:12:21,720
And so, if we now take a look at Jonas

260
00:12:21,720 --> 00:12:24,220
and at Matilda also,

261
00:12:24,220 --> 00:12:27,080
then we should see this property,

262
00:12:27,080 --> 00:12:29,620
so the species on both of them

263
00:12:30,700 --> 00:12:33,070
and actually not directly here

264
00:12:33,070 --> 00:12:36,120
but indeed they will be here

265
00:12:36,120 --> 00:12:38,070
in this prototype.

266
00:12:38,070 --> 00:12:42,680
And so, we will be able to do Jonas dot species

267
00:12:42,680 --> 00:12:45,023
and Matilda dot species.

268
00:12:46,300 --> 00:12:49,680
And both of these objects will then inherit

269
00:12:49,680 --> 00:12:52,700
so they will get access to this property

270
00:12:52,700 --> 00:12:54,820
from the prototype.

271
00:12:54,820 --> 00:12:57,360
So, you see, in both cases,

272
00:12:57,360 --> 00:12:59,743
we indeed get Homo Sapiens.

273
00:13:00,700 --> 00:13:04,110
Now however, since when we take a look

274
00:13:04,110 --> 00:13:05,303
at these objects,

275
00:13:06,390 --> 00:13:10,020
well, as we just saw this property is not really

276
00:13:10,020 --> 00:13:11,820
directly in the object,

277
00:13:11,820 --> 00:13:14,350
so it's not its own property.

278
00:13:14,350 --> 00:13:16,950
So own properties are only the ones

279
00:13:16,950 --> 00:13:20,690
that are declared directly on the object itself.

280
00:13:20,690 --> 00:13:24,390
So, not including the inherited properties.

281
00:13:24,390 --> 00:13:26,630
And actually in JavaScript, there is a way

282
00:13:26,630 --> 00:13:28,600
of checking for that.

283
00:13:28,600 --> 00:13:30,290
So, we can do Jonas

284
00:13:30,290 --> 00:13:34,393
as own property.

285
00:13:35,500 --> 00:13:37,933
So that's with a capital P here.

286
00:13:38,950 --> 00:13:40,560
And so let's first check

287
00:13:40,560 --> 00:13:42,963
for first name,

288
00:13:43,980 --> 00:13:47,000
and indeed this object does have its own property

289
00:13:47,000 --> 00:13:48,760
with this name

290
00:13:48,760 --> 00:13:50,513
but now if we try species,

291
00:13:51,835 --> 00:13:54,370
then that is gonna be false.

292
00:13:54,370 --> 00:13:57,240
And again, that's because this property

293
00:13:57,240 --> 00:14:00,890
is not really inside of the Jonas object.

294
00:14:00,890 --> 00:14:02,900
It simply has access to it

295
00:14:02,900 --> 00:14:05,130
because of its prototype.

296
00:14:05,130 --> 00:14:09,113
So because it's in the prototype property of person.

297
00:14:10,250 --> 00:14:13,933
So right here, right?

298
00:14:15,030 --> 00:14:17,500
And sometimes, this method here

299
00:14:17,500 --> 00:14:21,210
can be quite helpful in certain situations.

300
00:14:21,210 --> 00:14:24,040
Now right, and that is probably enough

301
00:14:24,040 --> 00:14:25,660
for one lecture.

302
00:14:25,660 --> 00:14:27,770
And as I just mentioned earlier

303
00:14:27,770 --> 00:14:28,840
in the next video

304
00:14:28,840 --> 00:14:30,950
I'm gonna show you a nice diagram

305
00:14:30,950 --> 00:14:32,380
of all of this.

306
00:14:32,380 --> 00:14:34,493
So, stay tuned for that one.

