WEBVTT

1
00:00:01.610 --> 00:00:04.130
<v Jonas>So over the last couple of lectures,</v>

2
00:00:04.130 --> 00:00:08.940
we explored how prototypal inheritance works in JavaScript.

3
00:00:08.940 --> 00:00:12.370
And we did that using a couple of different techniques.

4
00:00:12.370 --> 00:00:16.040
So we used constructor functions, ES6 classes,

5
00:00:16.040 --> 00:00:18.788
and object dot create.

6
00:00:18.788 --> 00:00:23.480
Now all of these techniques basically allow objects

7
00:00:23.480 --> 00:00:26.810
to inherit methods from its prototype.

8
00:00:26.810 --> 00:00:30.754
So to delegate their behavior to their prototype,

9
00:00:30.754 --> 00:00:32.020
right?

10
00:00:32.020 --> 00:00:34.770
But now it's time to turn our attention

11
00:00:34.770 --> 00:00:36.890
to more real inheritance.

12
00:00:36.890 --> 00:00:40.430
So in the way that we learned in the very first lecture

13
00:00:40.430 --> 00:00:42.130
of the section.

14
00:00:42.130 --> 00:00:45.320
So what I'm talking about is real inheritance

15
00:00:45.320 --> 00:00:46.870
between classes

16
00:00:46.870 --> 00:00:50.810
and not just prototypal inheritance between instances

17
00:00:50.810 --> 00:00:54.620
and a prototype property like we've been doing so far.

18
00:00:54.620 --> 00:00:57.150
And I'm using class terminology here

19
00:00:57.150 --> 00:01:00.050
because this simply makes it easier to understand

20
00:01:00.050 --> 00:01:01.520
what we're gonna do.

21
00:01:01.520 --> 00:01:05.030
But of course, you already know that real classes

22
00:01:05.030 --> 00:01:07.640
do not exist in JavaScript.

23
00:01:07.640 --> 00:01:10.620
But anyway here is what we're gonna do.

24
00:01:10.620 --> 00:01:13.480
So we will create a new student class

25
00:01:13.480 --> 00:01:16.570
and make it inherit from the person class

26
00:01:16.570 --> 00:01:18.940
that we have been using so far.

27
00:01:18.940 --> 00:01:21.830
So person will be the parent class

28
00:01:21.830 --> 00:01:24.620
and student will be the child class.

29
00:01:24.620 --> 00:01:29.360
that's because student is basically a subtype of a person.

30
00:01:29.360 --> 00:01:33.310
So a student is also a person, right?

31
00:01:33.310 --> 00:01:36.000
But it is a more specific person.

32
00:01:36.000 --> 00:01:39.560
And so this is an ideal child class.

33
00:01:39.560 --> 00:01:41.690
Now this is really useful

34
00:01:41.690 --> 00:01:44.140
because with this inheritance set up,

35
00:01:44.140 --> 00:01:47.340
we can have specific methods for the student,

36
00:01:47.340 --> 00:01:51.560
but then the student can also use generic person methods,

37
00:01:51.560 --> 00:01:55.210
like the calcAge method that we have been using.

38
00:01:55.210 --> 00:01:58.450
And that's basically the idea of inheritance that

39
00:01:58.450 --> 00:02:01.000
we're gonna implement in this lecture.

40
00:02:01.000 --> 00:02:04.130
Now, just like before we will start by implementing

41
00:02:04.130 --> 00:02:06.483
this using constructor functions.

42
00:02:07.550 --> 00:02:08.750
So in this lecture,

43
00:02:08.750 --> 00:02:13.080
we will inherit between classes using constructor functions,

44
00:02:13.080 --> 00:02:15.610
and this is gonna be a bit of work,

45
00:02:15.610 --> 00:02:18.319
but it will allow you to understand exactly

46
00:02:18.319 --> 00:02:21.770
how we set up the prototype chain in order

47
00:02:21.770 --> 00:02:25.430
to allow inheritance between the prototype properties

48
00:02:25.430 --> 00:02:28.650
of two different constructor functions.

49
00:02:28.650 --> 00:02:30.150
Then in the next lecture,

50
00:02:30.150 --> 00:02:33.460
we're gonna do the same thing using ES6 classes,

51
00:02:33.460 --> 00:02:36.780
which as you would expect is a lot easier.

52
00:02:36.780 --> 00:02:38.230
And finally, of course,

53
00:02:38.230 --> 00:02:42.600
we will go back to using object dot create as well.

54
00:02:42.600 --> 00:02:44.650
All right, but enough talk,

55
00:02:44.650 --> 00:02:46.733
let's put this into practice now.

56
00:02:48.290 --> 00:02:51.983
So here I already have the person function constructor

57
00:02:51.983 --> 00:02:54.210
that we have been working with in the beginning

58
00:02:54.210 --> 00:02:57.610
of the section and also the calcAge method

59
00:02:57.610 --> 00:03:01.520
that we set up on the prototype property of person.

60
00:03:01.520 --> 00:03:04.569
So this is just a copy of what we already did.

61
00:03:04.569 --> 00:03:08.870
And so now let's continue by building a constructor function

62
00:03:08.870 --> 00:03:09.943
for the student.

63
00:03:11.950 --> 00:03:14.173
So const student.

64
00:03:17.230 --> 00:03:19.890
Now usually we want a child class

65
00:03:19.890 --> 00:03:23.530
to have the same functionality as the parent class,

66
00:03:23.530 --> 00:03:26.660
but with some additional functionality.

67
00:03:26.660 --> 00:03:29.930
And so usually we pass in the same arguments,

68
00:03:29.930 --> 00:03:33.109
but then also some additional ones.

69
00:03:33.109 --> 00:03:38.100
So that's gonna be again, first name and birth year,

70
00:03:38.100 --> 00:03:41.053
and then we will also pass in the course.

71
00:03:43.353 --> 00:03:45.343
And now everything works the same here.

72
00:03:46.400 --> 00:03:51.400
So first name is gonna be first name this dot birth year

73
00:03:53.490 --> 00:03:57.090
is birth year and finally this dot course

74
00:03:58.940 --> 00:04:03.880
is gonna be the course, that gets into the function.

75
00:04:03.880 --> 00:04:06.370
So you see that in fact,

76
00:04:06.370 --> 00:04:09.540
this student class here has kind of the same data

77
00:04:09.540 --> 00:04:10.900
as the person.

78
00:04:10.900 --> 00:04:14.530
So it also has the first name and the birth year,

79
00:04:14.530 --> 00:04:17.020
but then it has an additional property,

80
00:04:17.020 --> 00:04:18.243
which is the course.

81
00:04:21.230 --> 00:04:23.823
So now let's actually create a new student.

82
00:04:25.660 --> 00:04:27.573
So I'm calling him Mike here.

83
00:04:29.770 --> 00:04:33.853
Born in 2020 and studying Computer Science.

84
00:04:40.530 --> 00:04:43.393
And just to make sure let's log in to the console,

85
00:04:46.450 --> 00:04:48.073
and here indeed it is.

86
00:04:50.420 --> 00:04:52.963
Let's now quickly add a method as well.

87
00:04:54.890 --> 00:04:58.720
So we take the prototype property one more time

88
00:04:58.720 --> 00:05:02.223
and then let's create a method called introduce.

89
00:05:05.960 --> 00:05:06.793
And so here,

90
00:05:07.910 --> 00:05:10.310
we're simply gonna log like an introduction phrase

91
00:05:10.310 --> 00:05:11.513
to the console.

92
00:05:12.600 --> 00:05:15.710
So for the student to introduce himself,

93
00:05:15.710 --> 00:05:20.710
so my name is this dot first name and I study,

94
00:05:25.830 --> 00:05:27.430
and then the name of the course.

95
00:05:33.010 --> 00:05:34.663
So let's call that here,

96
00:05:36.750 --> 00:05:41.750
mike dot introduce and all right.

97
00:05:46.120 --> 00:05:48.560
So that works just fine.

98
00:05:48.560 --> 00:05:49.393
Great.

99
00:05:49.393 --> 00:05:51.460
So far so good.

100
00:05:51.460 --> 00:05:54.710
However, there is one thing that we can

101
00:05:54.710 --> 00:05:58.810
and should improve here in our student constructor function.

102
00:05:58.810 --> 00:06:02.000
So right now this part of the code here

103
00:06:02.000 --> 00:06:04.120
is basically a simple copy

104
00:06:04.120 --> 00:06:06.380
of the person function constructor.

105
00:06:06.380 --> 00:06:08.963
So of this one that we want

106
00:06:08.963 --> 00:06:11.210
to be the parent class, right?

107
00:06:11.210 --> 00:06:15.560
And as you know, having duplicate code is never a good idea.

108
00:06:15.560 --> 00:06:17.260
First because it violates

109
00:06:17.260 --> 00:06:19.940
the "don't repeat yourself" principle,

110
00:06:19.940 --> 00:06:23.020
but second and even worse in this case

111
00:06:23.020 --> 00:06:26.950
is that imagine that the implementation of person here

112
00:06:26.950 --> 00:06:28.580
changes in the future,

113
00:06:28.580 --> 00:06:31.883
then that change will not be reflected in the student.

114
00:06:33.350 --> 00:06:36.230
So instead of having this duplicate code here,

115
00:06:36.230 --> 00:06:39.003
let's simply call the person function.

116
00:06:39.950 --> 00:06:44.310
So person, and then we pass in first name

117
00:06:44.310 --> 00:06:46.473
and the birth year as well.

118
00:06:47.570 --> 00:06:50.780
Now, do you think that this is gonna work?

119
00:06:50.780 --> 00:06:52.340
Well let's see.

120
00:06:52.340 --> 00:06:56.500
And then I'm gonna to explain to you why this doesn't work.

121
00:06:56.500 --> 00:07:00.080
So the problem here is that we are now actually calling

122
00:07:00.080 --> 00:07:04.620
this person constructor function as a regular function call.

123
00:07:04.620 --> 00:07:06.920
So we are not using this new operator

124
00:07:06.920 --> 00:07:09.730
to call this person function constructor.

125
00:07:09.730 --> 00:07:12.300
And so therefore this function call here

126
00:07:12.300 --> 00:07:14.760
is simply a regular function call.

127
00:07:14.760 --> 00:07:17.860
And remember that in a regular function call,

128
00:07:17.860 --> 00:07:21.160
the this keyword is set to undefined.

129
00:07:21.160 --> 00:07:24.440
And so therefore that's why we get this error here,

130
00:07:24.440 --> 00:07:28.070
that it cannot set first name on undefined.

131
00:07:28.070 --> 00:07:32.000
So instead of simply calling the person function here,

132
00:07:32.000 --> 00:07:35.900
we need to manually set the this keyword as well.

133
00:07:35.900 --> 00:07:39.100
So do you remember how we can call a function?

134
00:07:39.100 --> 00:07:41.540
And at the same time set the this keywords

135
00:07:41.540 --> 00:07:43.630
inside that function?

136
00:07:43.630 --> 00:07:47.030
Well, we can simply use the call method.

137
00:07:47.030 --> 00:07:50.600
So the call method will indeed call this function,

138
00:07:50.600 --> 00:07:54.440
but we will be able to specify the this keywords

139
00:07:54.440 --> 00:07:57.580
here as the first argument in this function.

140
00:07:57.580 --> 00:08:01.310
And so in this case, we want the this Keyword

141
00:08:01.310 --> 00:08:04.750
in this function to simply be the this keyword

142
00:08:04.750 --> 00:08:08.410
inside this function here, right?

143
00:08:08.410 --> 00:08:11.650
Because as you know the this Keyword is gonna be

144
00:08:11.650 --> 00:08:12.623
in the beginning,

145
00:08:13.661 --> 00:08:17.240
this empty object that is being created by the new operator.

146
00:08:17.240 --> 00:08:19.720
And so it is on that new object

147
00:08:19.720 --> 00:08:22.010
where we want to set the first name

148
00:08:22.010 --> 00:08:23.860
and the birth year property.

149
00:08:23.860 --> 00:08:25.230
Right?

150
00:08:25.230 --> 00:08:29.520
So if we check this now, then it is back to working.

151
00:08:29.520 --> 00:08:33.283
And so this is a much better and more robust solution.

152
00:08:35.080 --> 00:08:35.970
Okay.

153
00:08:35.970 --> 00:08:38.633
So far, this is what we have built.

154
00:08:39.911 --> 00:08:42.070
So it's simply the student constructor function

155
00:08:42.070 --> 00:08:44.260
and its prototype property.

156
00:08:44.260 --> 00:08:48.230
And then the mike object linked to its prototype.

157
00:08:48.230 --> 00:08:50.630
And that prototype is of course

158
00:08:50.630 --> 00:08:54.090
the constructor functions prototype property.

159
00:08:54.090 --> 00:08:57.410
Now this link between instance and prototype

160
00:08:57.410 --> 00:09:01.120
has been made automatically by creating the mike object

161
00:09:01.120 --> 00:09:02.990
with the new operator.

162
00:09:02.990 --> 00:09:05.890
So all of this is what we had already learned.

163
00:09:05.890 --> 00:09:08.420
So this is nothing new at this point

164
00:09:08.420 --> 00:09:09.680
Right?

165
00:09:09.680 --> 00:09:13.010
Now a student is also a person.

166
00:09:13.010 --> 00:09:18.010
And so we want student and person to be connected like this.

167
00:09:18.290 --> 00:09:20.660
So we really want the student class

168
00:09:20.660 --> 00:09:25.270
to be the child class and inherit from the person class,

169
00:09:25.270 --> 00:09:28.690
which will then function as the parent class.

170
00:09:28.690 --> 00:09:31.970
So this way, all instances of student

171
00:09:31.970 --> 00:09:34.680
could also get access to methods

172
00:09:34.680 --> 00:09:37.440
from the person's prototype property,

173
00:09:37.440 --> 00:09:41.670
like the calcAge method through the prototype chain.

174
00:09:41.670 --> 00:09:44.720
And that's the whole idea of inheritance.

175
00:09:44.720 --> 00:09:47.930
Its the child classes can share behavior

176
00:09:47.930 --> 00:09:50.160
from their parent classes.

177
00:09:50.160 --> 00:09:54.480
So looking at this diagram, basically what we want to do

178
00:09:54.480 --> 00:09:57.040
is to make person dot prototype,

179
00:09:57.040 --> 00:10:00.436
the prototype of student dot prototype.

180
00:10:00.436 --> 00:10:02.170
Or in other words,

181
00:10:02.170 --> 00:10:05.310
we want to set the underscore protal property

182
00:10:05.310 --> 00:10:09.487
of student dot prototype to person dot prototype.

183
00:10:09.487 --> 00:10:11.960
And if this sounds confusing,

184
00:10:11.960 --> 00:10:14.990
then please just pause the video here for a minute

185
00:10:14.990 --> 00:10:18.820
and keep looking at this diagram for some more time.

186
00:10:18.820 --> 00:10:21.220
So that's why I created it.

187
00:10:21.220 --> 00:10:22.200
Okay?

188
00:10:22.200 --> 00:10:23.390
Now, anyway,

189
00:10:23.390 --> 00:10:27.140
we are gonna have to create this connection manually.

190
00:10:27.140 --> 00:10:28.430
And to do this,

191
00:10:28.430 --> 00:10:31.410
so to link these two prototype objects,

192
00:10:31.410 --> 00:10:34.400
we are gonna use object dot create

193
00:10:34.400 --> 00:10:36.880
because defining prototypes manually

194
00:10:36.880 --> 00:10:40.560
is exactly what object dot create does.

195
00:10:40.560 --> 00:10:41.393
Great.

196
00:10:41.393 --> 00:10:43.153
So let's go do that.

197
00:10:44.890 --> 00:10:48.370
So let's do what I just showed you on the slide

198
00:10:48.370 --> 00:10:50.150
here in our code.

199
00:10:50.150 --> 00:10:53.524
And it's important that you do this at exactly

200
00:10:53.524 --> 00:10:54.780
this point of the code.

201
00:10:54.780 --> 00:10:55.940
Okay?

202
00:10:55.940 --> 00:10:58.443
And I will tell you later why that is.

203
00:10:59.840 --> 00:11:03.993
So anyway, student dot prototype,

204
00:11:04.840 --> 00:11:09.223
should be object dot create,

205
00:11:11.410 --> 00:11:14.083
person dot prototype.

206
00:11:15.230 --> 00:11:16.230
And with this,

207
00:11:16.230 --> 00:11:20.212
the student dot prototype object is now an object that

208
00:11:20.212 --> 00:11:23.860
inherits from person dot prototype.

209
00:11:23.860 --> 00:11:27.100
Now we have to create this connection here

210
00:11:27.100 --> 00:11:29.470
before we add any more methods

211
00:11:29.470 --> 00:11:33.040
to the prototype object of student.

212
00:11:33.040 --> 00:11:35.120
And that's because object dot create,

213
00:11:35.120 --> 00:11:37.490
will return an empty object.

214
00:11:37.490 --> 00:11:41.950
And so at this point, student dot prototype is empty.

215
00:11:41.950 --> 00:11:44.680
And so then onto that empty object,

216
00:11:44.680 --> 00:11:47.660
we can add methods like this one.

217
00:11:47.660 --> 00:11:49.520
But if we did it the other way around

218
00:11:51.107 --> 00:11:53.890
so if this was after we created this method here,

219
00:11:53.890 --> 00:11:55.670
then object dot create

220
00:11:55.670 --> 00:11:58.023
would basically overwrite these methods

221
00:11:58.023 --> 00:11:59.730
that we had already added

222
00:11:59.730 --> 00:12:03.210
to the prototype object of student.

223
00:12:03.210 --> 00:12:05.910
Now you might be wondering why we even needed

224
00:12:07.207 --> 00:12:08.360
to use object dot create.

225
00:12:08.360 --> 00:12:11.363
So why didn't we just do this?

226
00:12:13.600 --> 00:12:18.600
So student dot prototype equals the person dot prototype,

227
00:12:22.820 --> 00:12:23.660
right?

228
00:12:23.660 --> 00:12:27.450
This many would have seen a little bit more logical to do,

229
00:12:27.450 --> 00:12:30.410
but in fact, this doesn't work at all.

230
00:12:30.410 --> 00:12:33.003
And let me actually show you why that is.

231
00:12:34.580 --> 00:12:37.190
So if we do student dot prototype

232
00:12:37.190 --> 00:12:39.860
equal to person dot prototype,

233
00:12:39.860 --> 00:12:44.490
then we will not end up with a prototype chain that we need.

234
00:12:44.490 --> 00:12:47.480
Instead, we would end up with this,

235
00:12:47.480 --> 00:12:50.724
which is a completely wrong prototype chain.

236
00:12:50.724 --> 00:12:53.840
And that's because here we're actually saying

237
00:12:53.840 --> 00:12:56.240
that the student's prototype property

238
00:12:56.240 --> 00:12:58.185
and a person's prototype property

239
00:12:58.185 --> 00:13:01.360
should be the exact same object.

240
00:13:01.360 --> 00:13:05.090
But in fact that's just not what we want.

241
00:13:05.090 --> 00:13:08.350
What we do want is the person's prototype object

242
00:13:08.350 --> 00:13:12.700
to be the prototype of student dot prototype.

243
00:13:12.700 --> 00:13:15.150
So we want to inherit from it,

244
00:13:15.150 --> 00:13:18.700
but it should not be the exact same object.

245
00:13:18.700 --> 00:13:22.631
And that's why we actually needed object dot create.

246
00:13:22.631 --> 00:13:24.254
Alright,

247
00:13:24.254 --> 00:13:29.254
so let's get rid of this bad code and here let's just say

248
00:13:29.670 --> 00:13:33.130
linking prototypes.

249
00:13:33.130 --> 00:13:35.850
And so now with all of this in place,

250
00:13:35.850 --> 00:13:36.683
we should be able

251
00:13:36.683 --> 00:13:39.884
to do mike dot calcAge,

252
00:13:39.884 --> 00:13:44.360
and indeed we get the age of 17.

253
00:13:44.360 --> 00:13:45.460
Beautiful.

254
00:13:45.460 --> 00:13:47.640
So this worked just fine.

255
00:13:47.640 --> 00:13:50.170
And so let's actually now go analyze

256
00:13:50.170 --> 00:13:51.883
what exactly happened here.

257
00:13:53.450 --> 00:13:55.720
And we already know that this worked

258
00:13:55.720 --> 00:13:58.100
because of the prototype chain,

259
00:13:58.100 --> 00:14:00.570
but let's see exactly how.

260
00:14:00.570 --> 00:14:03.600
So when we do mike dot calcAge,

261
00:14:03.600 --> 00:14:08.180
we are effectively doing a property or a method lookup.

262
00:14:08.180 --> 00:14:09.550
So that is JavaScript

263
00:14:09.550 --> 00:14:13.650
trying to find the requested property or method.

264
00:14:13.650 --> 00:14:15.750
Now, in this case, as we know,

265
00:14:15.750 --> 00:14:17.990
the calcAge method is of course

266
00:14:17.990 --> 00:14:20.970
not directly on the mike object.

267
00:14:20.970 --> 00:14:24.320
It's also not in mike's prototype.

268
00:14:24.320 --> 00:14:27.330
That's where we defined the introduced method,

269
00:14:27.330 --> 00:14:29.250
but not calcAge.

270
00:14:29.250 --> 00:14:30.350
Right?

271
00:14:30.350 --> 00:14:31.990
So just like before,

272
00:14:31.990 --> 00:14:34.710
whenever we try to access a method,

273
00:14:34.710 --> 00:14:37.400
that's not on the object's prototype,

274
00:14:37.400 --> 00:14:40.330
then JavaScript, will look up even further

275
00:14:40.330 --> 00:14:44.270
in the prototype chain and see if it can find a method

276
00:14:44.270 --> 00:14:46.460
so in the parent prototype.

277
00:14:46.460 --> 00:14:48.960
And that's exactly what happens here.

278
00:14:48.960 --> 00:14:52.077
So JavaScript will finally find the calcAge

279
00:14:52.077 --> 00:14:54.380
in person dot prototype,

280
00:14:54.380 --> 00:14:57.420
which is exactly where we defined it.

281
00:14:57.420 --> 00:14:58.820
And that's the whole reason

282
00:14:58.820 --> 00:15:02.150
why we set up the prototype chain like this

283
00:15:02.150 --> 00:15:05.790
so that the mike object can inherit whatever methods

284
00:15:05.790 --> 00:15:09.110
are in its parent class, basically.

285
00:15:09.110 --> 00:15:10.210
So in summary,

286
00:15:10.210 --> 00:15:12.770
we are now able to call a method

287
00:15:12.770 --> 00:15:15.530
that is on a person's prototype property,

288
00:15:15.530 --> 00:15:19.170
on a student object, and it still works.

289
00:15:19.170 --> 00:15:22.058
So that's the power of inheritance.

290
00:15:22.058 --> 00:15:23.620
Great.

291
00:15:23.620 --> 00:15:25.460
And since we're already here,

292
00:15:25.460 --> 00:15:28.890
let's also quickly complete the prototype chain.

293
00:15:28.890 --> 00:15:32.970
So just like before object dot prototype will sit on

294
00:15:34.046 --> 00:15:35.290
top of the prototype chain.

295
00:15:35.290 --> 00:15:38.170
So of course we could still call a method

296
00:15:38.170 --> 00:15:42.130
like the s on property method on mike too.

297
00:15:42.130 --> 00:15:44.050
It doesn't matter how far away

298
00:15:44.050 --> 00:15:46.940
in the prototype chain a method is.

299
00:15:46.940 --> 00:15:47.810
And with this,

300
00:15:47.810 --> 00:15:50.660
we now have the full picture of how inheritance

301
00:15:50.660 --> 00:15:54.540
between classes works with function constructors.

302
00:15:54.540 --> 00:15:56.990
And of course, with ES6 classes,

303
00:15:56.990 --> 00:15:59.730
it works exactly the same internally.

304
00:15:59.730 --> 00:16:02.410
All that changes is the syntax.

305
00:16:02.410 --> 00:16:04.980
So when we do the same thing in the next video

306
00:16:04.980 --> 00:16:07.920
using ES6 classes, then keep in mind

307
00:16:07.920 --> 00:16:10.803
that it's gonna work just like I described here.

308
00:16:12.590 --> 00:16:14.880
And so now just to finish this video,

309
00:16:14.880 --> 00:16:19.270
let's quickly inspect all of this also in the console,

310
00:16:19.270 --> 00:16:24.270
let's say mike dot underscore underscore proto.

311
00:16:27.580 --> 00:16:32.580
And so this is of course gonna to be, this object here,

312
00:16:33.565 --> 00:16:35.223
which contains the introduce method,

313
00:16:36.140 --> 00:16:37.540
all right?

314
00:16:37.540 --> 00:16:39.050
So this is nothing new,

315
00:16:39.050 --> 00:16:40.730
but you see here right in the console

316
00:16:40.730 --> 00:16:43.513
that this itself has a prototype too.

317
00:16:44.920 --> 00:16:47.039
So let's try this here,

318
00:16:47.039 --> 00:16:50.110
and so see the next prototype.

319
00:16:50.110 --> 00:16:54.240
And so now this is indeed the prototype,

320
00:16:54.240 --> 00:16:57.170
which contains the calcAge function.

321
00:16:57.170 --> 00:17:02.170
And so in fact that is exactly this object here.

322
00:17:04.880 --> 00:17:06.347
Right?

323
00:17:06.347 --> 00:17:09.220
And maybe it's even easier to visualize

324
00:17:09.220 --> 00:17:10.803
in the console like this.

325
00:17:11.710 --> 00:17:14.290
So taking a look at mike itself,

326
00:17:14.290 --> 00:17:19.290
and then mike's prototype is a person here,

327
00:17:19.800 --> 00:17:21.420
which is actually not correct

328
00:17:21.420 --> 00:17:23.203
and we will fix that in a second.

329
00:17:24.220 --> 00:17:26.360
So, I mean, In the prototype chain,

330
00:17:26.360 --> 00:17:29.623
everything is correct, but here it should say student,

331
00:17:31.070 --> 00:17:33.967
so you see that right now, it says person,

332
00:17:33.967 --> 00:17:37.233
but Mike is actually of the type student.

333
00:17:39.150 --> 00:17:40.050
Okay.

334
00:17:40.050 --> 00:17:43.000
But anyway, here you see the introduced method

335
00:17:43.000 --> 00:17:45.300
that we defined earlier.

336
00:17:45.300 --> 00:17:48.249
And then if we go even further into this,

337
00:17:48.249 --> 00:17:51.690
so not this one,

338
00:17:51.690 --> 00:17:56.690
but this one then you see, of course the calcAge function,

339
00:17:56.960 --> 00:18:01.000
which is in the prototype of the prototype basically.

340
00:18:01.000 --> 00:18:02.513
Right?

341
00:18:02.513 --> 00:18:07.513
So what I said that we need to fix is this.

342
00:18:08.490 --> 00:18:10.622
So when we take a look at

343
00:18:10.622 --> 00:18:15.622
student dot prototype dot constructor,

344
00:18:17.957 --> 00:18:21.890
then remember that ideally this should point back

345
00:18:21.890 --> 00:18:24.263
to the student, right?

346
00:18:25.230 --> 00:18:28.870
But here it points back, apparently to person.

347
00:18:28.870 --> 00:18:31.843
So actually we should use console dot dir

348
00:18:33.520 --> 00:18:36.470
And so you see that JavaScript now, thinks

349
00:18:36.470 --> 00:18:39.890
that the constructor of student or prototype

350
00:18:39.890 --> 00:18:41.453
is person here.

351
00:18:43.250 --> 00:18:44.840
And the reason for that is

352
00:18:44.840 --> 00:18:48.450
that we set the prototype property of the student

353
00:18:48.450 --> 00:18:50.650
using object dot create.

354
00:18:50.650 --> 00:18:52.360
And so this makes it so

355
00:18:52.360 --> 00:18:55.580
that the constructor of student dot prototype

356
00:18:55.580 --> 00:18:57.400
is still person.

357
00:18:57.400 --> 00:19:00.980
So we need to fix this because sometimes it's important

358
00:19:00.980 --> 00:19:04.040
to rely on this constructor property.

359
00:19:04.040 --> 00:19:06.414
And so if we want to rely on that,

360
00:19:06.414 --> 00:19:09.200
it should indeed be correct.

361
00:19:09.200 --> 00:19:11.230
But that's easy to fix.

362
00:19:11.230 --> 00:19:16.090
We can just say student dot prototype dot constructor

363
00:19:18.020 --> 00:19:20.233
and set it to student.

364
00:19:21.800 --> 00:19:25.090
but let me just try out some more things here.

365
00:19:25.090 --> 00:19:27.850
So just to make sure everything works

366
00:19:27.850 --> 00:19:31.963
so we can again use the instance of, operator here.

367
00:19:34.600 --> 00:19:36.940
And so this of course is gonna be true

368
00:19:36.940 --> 00:19:38.600
because student is of course

369
00:19:38.600 --> 00:19:41.540
the constructor function of mike.

370
00:19:41.540 --> 00:19:45.220
But if we try to same now with person

371
00:19:45.220 --> 00:19:49.020
then that indeed should be also true.

372
00:19:49.020 --> 00:19:50.740
And so, in fact it is.

373
00:19:50.740 --> 00:19:52.300
And so again,

374
00:19:52.300 --> 00:19:55.470
it's because we linked the prototypes together.

375
00:19:55.470 --> 00:19:57.700
So if we didn't have this,

376
00:19:57.700 --> 00:19:59.000
then this should be false.

377
00:20:00.560 --> 00:20:02.071
So of course,

378
00:20:02.071 --> 00:20:05.240
mike dot calcAge is not a function in this case

379
00:20:05.240 --> 00:20:08.680
because the prototype chain is now not correctly set up

380
00:20:08.680 --> 00:20:10.371
to find this method,

381
00:20:10.371 --> 00:20:12.977
but let's quickly take this out.

382
00:20:12.977 --> 00:20:17.633
And so now indeed mike is no longer an instance of person.

383
00:20:19.150 --> 00:20:19.983
And of course,

384
00:20:20.885 --> 00:20:24.040
mike is also an instance of object because this also

385
00:20:24.040 --> 00:20:26.070
in its prototype chain.

386
00:20:26.070 --> 00:20:27.040
Now, right.

387
00:20:27.040 --> 00:20:29.740
So here, we just proved that a prototype chain

388
00:20:31.117 --> 00:20:33.667
is in fact set up the way that we intended it to be

389
00:20:34.670 --> 00:20:35.640
all right.

390
00:20:35.640 --> 00:20:38.349
And that's the end of a very long,

391
00:20:38.349 --> 00:20:41.540
and I admit complex lecture.

392
00:20:41.540 --> 00:20:44.900
But I hope that I could still consolidate your knowledge

393
00:20:44.900 --> 00:20:48.371
about prototypes and the prototype chain even further

394
00:20:48.371 --> 00:20:51.740
because you know how to even manipulate

395
00:20:51.740 --> 00:20:55.040
the prototype chain yourself manually.

396
00:20:55.040 --> 00:20:57.290
And actually let's now go test,

397
00:20:57.290 --> 00:20:59.520
if you did actually understand

398
00:20:59.520 --> 00:21:01.433
right in the next coding challenge.

