Would you like to inspect the original subtitles? These are the user uploaded subtitles that are being translated:
1
1
00:00:01,210 --> 00:00:03,050
Let's finally implement
2
2
00:00:03,050 --> 00:00:05,420
object oriented programming now.
3
3
00:00:05,420 --> 00:00:08,393
And starting with constructor functions.
4
4
00:00:10,390 --> 00:00:14,170
And as always, I already have to start our files open here
5
5
00:00:14,170 --> 00:00:16,140
in my VS code editor.
6
6
00:00:16,140 --> 00:00:19,280
So please go ahead and do the same now.
7
7
00:00:19,280 --> 00:00:23,040
And we can actually already also open up a new terminal
8
8
00:00:24,880 --> 00:00:26,913
and start our live server.
9
9
00:00:28,740 --> 00:00:31,973
So we can close that, open up the console here,
10
10
00:00:32,810 --> 00:00:34,870
and increase it a little bit,
11
11
00:00:34,870 --> 00:00:38,470
and now we're all set up and ready to go.
12
12
00:00:38,470 --> 00:00:40,980
So, we actually kind of used
13
13
00:00:40,980 --> 00:00:43,220
object oriented programming before
14
14
00:00:43,220 --> 00:00:45,320
but in a very limited way.
15
15
00:00:45,320 --> 00:00:49,970
Because we had no way of programmatically creating objects.
16
16
00:00:49,970 --> 00:00:54,790
And so all we did was to use some simple object literals
17
17
00:00:54,790 --> 00:00:58,210
for example, in the bankist app, right?
18
18
00:00:58,210 --> 00:01:02,380
But now that all changes with constructor functions.
19
19
00:01:02,380 --> 00:01:05,010
So, we can use constructor functions,
20
20
00:01:05,010 --> 00:01:08,350
to build an object using a function.
21
21
00:01:08,350 --> 00:01:11,600
Now, a constructor function is actually
22
22
00:01:11,600 --> 00:01:14,290
a completely normal function.
23
23
00:01:14,290 --> 00:01:17,240
The only difference between a regular function,
24
24
00:01:17,240 --> 00:01:20,400
and a function that we call constructor function,
25
25
00:01:20,400 --> 00:01:22,980
is that we call a constructor function
26
26
00:01:22,980 --> 00:01:25,570
with the new operator.
27
27
00:01:25,570 --> 00:01:26,710
But enough talk,
28
28
00:01:26,710 --> 00:01:29,890
let's now actually create a constructor function
29
29
00:01:29,890 --> 00:01:31,313
for a person.
30
30
00:01:32,720 --> 00:01:37,720
So that person and in OOP there is this convention
31
31
00:01:38,633 --> 00:01:41,310
that constructor functions always start
32
32
00:01:41,310 --> 00:01:43,060
with a capital letter.
33
33
00:01:43,060 --> 00:01:46,350
And so we should always follow that convention too.
34
34
00:01:46,350 --> 00:01:49,000
And in fact, other a built in constructors
35
35
00:01:49,000 --> 00:01:52,523
like array or map, follow that convention as well.
36
36
00:01:55,340 --> 00:01:57,860
Now here I'm using a function expression
37
37
00:01:57,860 --> 00:02:01,830
but of course a function declaration will also work.
38
38
00:02:01,830 --> 00:02:05,100
Now an arrow function will actually not work
39
39
00:02:05,100 --> 00:02:07,060
as a function constructor.
40
40
00:02:07,060 --> 00:02:10,710
And that's because it doesn't have its own this keyword
41
41
00:02:10,710 --> 00:02:13,070
and we need that, okay.
42
42
00:02:13,070 --> 00:02:17,000
So only function declarations and function expressions.
43
43
00:02:17,000 --> 00:02:18,770
Now remember that this function
44
44
00:02:18,770 --> 00:02:21,390
is basically gonna produce an object
45
45
00:02:21,390 --> 00:02:23,393
and in this case for a person.
46
46
00:02:24,350 --> 00:02:27,280
So we want a person to have a name
47
47
00:02:27,280 --> 00:02:31,363
or let's say a first name and a birth here.
48
48
00:02:32,770 --> 00:02:35,390
And so we specified these two parameters
49
49
00:02:35,390 --> 00:02:38,160
for that here in our constructor function
50
50
00:02:38,160 --> 00:02:42,250
so that we can then pass in the name and the birth year.
51
51
00:02:42,250 --> 00:02:44,493
And now let's actually call this function.
52
52
00:02:46,380 --> 00:02:48,710
And so, as I said, previously,
53
53
00:02:48,710 --> 00:02:51,510
the only difference between a regular function,
54
54
00:02:51,510 --> 00:02:55,530
and a constructor function is that we call the constructor
55
55
00:02:55,530 --> 00:02:58,300
using the new keyword.
56
56
00:02:58,300 --> 00:03:03,300
So we write new, then person and then let's pass in Jonas
57
57
00:03:05,630 --> 00:03:08,133
and 1991, let's say.
58
58
00:03:08,970 --> 00:03:11,330
So this new operator here,
59
59
00:03:11,330 --> 00:03:14,160
is actually a very special operator
60
60
00:03:14,160 --> 00:03:17,540
because what it does is to call this function here.
61
61
00:03:17,540 --> 00:03:19,250
So this person function,
62
62
00:03:19,250 --> 00:03:22,770
but it does a whole lot more than just that.
63
63
00:03:22,770 --> 00:03:26,380
So let's see what exactly happens when we call a function
64
64
00:03:26,380 --> 00:03:28,913
with the new operator like this.
65
65
00:03:29,880 --> 00:03:32,863
So behind the scenes, there have been four steps.
66
66
00:03:34,240 --> 00:03:35,830
And let me actually write them here
67
67
00:03:35,830 --> 00:03:38,170
because this is very important.
68
68
00:03:38,170 --> 00:03:42,400
So first, a new empty object is created.
69
69
00:03:42,400 --> 00:03:45,313
So an empty object is created,
70
70
00:03:46,310 --> 00:03:50,800
then afterwards the function is called
71
71
00:03:50,800 --> 00:03:54,600
and in this function call the this keyword will be set
72
72
00:03:54,600 --> 00:03:56,653
to this newly created object.
73
73
00:03:58,090 --> 00:04:01,030
All right? So let's write that here.
74
74
00:04:01,030 --> 00:04:04,930
So the this keyword is this new empty object.
75
75
00:04:04,930 --> 00:04:08,000
So, basically in the execution context
76
76
00:04:08,000 --> 00:04:09,780
of the person function,
77
77
00:04:09,780 --> 00:04:13,240
the this keyword will point to this new object here
78
78
00:04:13,240 --> 00:04:16,123
that was created in step number one.
79
79
00:04:18,230 --> 00:04:20,440
And remember all of this happens
80
80
00:04:20,440 --> 00:04:22,870
only because we are calling the function
81
81
00:04:22,870 --> 00:04:25,053
using the new operator here.
82
82
00:04:27,180 --> 00:04:31,060
So step number three is that this newly created object
83
83
00:04:31,060 --> 00:04:33,223
is linked to a prototype.
84
84
00:04:35,400 --> 00:04:40,400
So linked to prototype but more about this
85
85
00:04:40,830 --> 00:04:42,290
in the next video.
86
86
00:04:42,290 --> 00:04:46,343
For now, we just care about creating the object itself.
87
87
00:04:47,190 --> 00:04:48,910
Finally, the last step,
88
88
00:04:48,910 --> 00:04:52,080
is that the object that was created in the beginning
89
89
00:04:52,080 --> 00:04:54,130
is then automatically returned
90
90
00:04:54,130 --> 00:04:55,943
from the constructor function.
91
91
00:04:56,820 --> 00:05:01,820
So the function automatically returns
92
92
00:05:02,120 --> 00:05:05,280
that empty object from the beginning.
93
93
00:05:05,280 --> 00:05:07,220
But actually at this point,
94
94
00:05:07,220 --> 00:05:10,160
the object no longer needs to be empty.
95
95
00:05:10,160 --> 00:05:12,280
And this is actually the trick
96
96
00:05:12,280 --> 00:05:14,633
of making the constructor function work.
97
97
00:05:15,610 --> 00:05:17,360
So let's go here now
98
98
00:05:17,360 --> 00:05:21,520
and the lock to the console, the this keyword.
99
99
00:05:21,520 --> 00:05:23,880
And so we already know that it should be
100
100
00:05:23,880 --> 00:05:26,690
this empty object that was just created here
101
101
00:05:26,690 --> 00:05:29,030
in step number one, right?
102
102
00:05:29,030 --> 00:05:30,250
Because the this keyword
103
103
00:05:30,250 --> 00:05:35,250
inside this function will be exactly that empty object.
104
104
00:05:35,480 --> 00:05:38,110
And again, that's because we are calling it
105
105
00:05:38,110 --> 00:05:40,790
with the new keyword.
106
106
00:05:40,790 --> 00:05:42,290
So let's see.
107
107
00:05:42,290 --> 00:05:45,090
And indeed we get to this empty object.
108
108
00:05:45,090 --> 00:05:48,650
And the browser console is actually already telling us
109
109
00:05:48,650 --> 00:05:53,000
that it's basically here of the type of person, all right?
110
110
00:05:53,000 --> 00:05:57,280
And so this is just the name of the constructor function.
111
111
00:05:57,280 --> 00:05:58,340
All right.
112
112
00:05:58,340 --> 00:06:01,680
And now let's use this knowledge to our advantage.
113
113
00:06:01,680 --> 00:06:05,420
Because we already know that in the end of this function,
114
114
00:06:05,420 --> 00:06:08,660
the this keyword will basically be returned.
115
115
00:06:08,660 --> 00:06:12,340
And so whatever we add to that empty object,
116
116
00:06:12,340 --> 00:06:14,770
will then be returned from the function.
117
117
00:06:14,770 --> 00:06:17,963
And that returned object, is gonna be the object,
118
118
00:06:17,963 --> 00:06:20,573
that we are trying to build here, actually.
119
119
00:06:22,000 --> 00:06:24,600
So, all we need to do is to now take
120
120
00:06:24,600 --> 00:06:26,550
that first name parameter,
121
121
00:06:26,550 --> 00:06:28,530
so the value that we receive,
122
122
00:06:28,530 --> 00:06:31,880
and then create a property on the this keyword
123
123
00:06:31,880 --> 00:06:35,113
with the same name and then set it to that value.
124
124
00:06:37,150 --> 00:06:42,150
And then the same with the birth year, equal to birth year.
125
125
00:06:44,360 --> 00:06:47,940
And so now let's store the result here
126
126
00:06:47,940 --> 00:06:51,323
in some variable and that's actually it.
127
127
00:06:52,200 --> 00:06:54,713
So let's see what Jonas is gonna look like,
128
128
00:06:56,950 --> 00:06:59,970
now and we have to log it to the console here.
129
129
00:06:59,970 --> 00:07:02,170
If we want to take a look at it.
130
130
00:07:02,170 --> 00:07:05,960
And indeed here it is, here is the person object
131
131
00:07:05,960 --> 00:07:09,020
with the first name Jonas and the birth year,
132
132
00:07:09,020 --> 00:07:12,960
that we passed here into the constructor function.
133
133
00:07:12,960 --> 00:07:16,460
So, let's quickly recap what just happened here.
134
134
00:07:16,460 --> 00:07:20,090
So again, we're calling this constructor function
135
135
00:07:20,090 --> 00:07:23,290
with the new keyword or the new operator.
136
136
00:07:23,290 --> 00:07:27,460
And so therefore a new empty object is created right away.
137
137
00:07:27,460 --> 00:07:29,460
Then the function is called
138
138
00:07:29,460 --> 00:07:33,640
and then here the this keyword, is that empty object.
139
139
00:07:33,640 --> 00:07:36,710
And then in the function, we start to set properties
140
140
00:07:36,710 --> 00:07:38,380
to that object.
141
141
00:07:38,380 --> 00:07:40,730
And we give them the exact same name
142
142
00:07:40,730 --> 00:07:44,080
as the parameters that we're passing in here.
143
143
00:07:44,080 --> 00:07:46,470
And of course they could have any other name,
144
144
00:07:46,470 --> 00:07:50,330
so it doesn't have to be the same name as our arguments.
145
145
00:07:50,330 --> 00:07:53,950
So it doesn't have to be the same name as our parameters,
146
146
00:07:53,950 --> 00:07:56,410
but this is kind of a convention.
147
147
00:07:56,410 --> 00:07:58,650
So if we pass in first name
148
148
00:07:58,650 --> 00:08:01,983
then we should also create a property called first name.
149
149
00:08:03,350 --> 00:08:05,660
So then here by the end of the function
150
150
00:08:05,660 --> 00:08:10,150
or this keyword now has these two new properties.
151
151
00:08:10,150 --> 00:08:12,220
And then here in step number four,
152
152
00:08:12,220 --> 00:08:14,900
that object that was created in the beginning,
153
153
00:08:14,900 --> 00:08:18,130
is then automatically returned from the function.
154
154
00:08:18,130 --> 00:08:19,303
And so at this point,
155
155
00:08:19,303 --> 00:08:22,990
that is the object with these two properties.
156
156
00:08:22,990 --> 00:08:26,726
And so that's gonna be the result of this function call,
157
157
00:08:26,726 --> 00:08:29,930
and so it will then be stored in Jonas
158
158
00:08:29,930 --> 00:08:32,320
and then that's what we get here.
159
159
00:08:32,320 --> 00:08:33,670
Great.
160
160
00:08:33,670 --> 00:08:35,630
So I hope that made sense.
161
161
00:08:35,630 --> 00:08:39,180
And so now of course we can use this constructor function
162
162
00:08:39,180 --> 00:08:42,613
to create as many different objects as we want.
163
163
00:08:46,360 --> 00:08:51,223
So let's say we want to create Matilda new person,
164
164
00:08:52,980 --> 00:08:56,053
Matilda and then let's say 2017,
165
165
00:08:57,800 --> 00:09:00,660
and let's just do another one, why not?
166
166
00:09:00,660 --> 00:09:03,570
Let's call it Jack new person,
167
167
00:09:03,570 --> 00:09:05,690
just so you see that we can create
168
168
00:09:05,690 --> 00:09:09,343
as many objects now based on this constructor function.
169
169
00:09:12,040 --> 00:09:15,470
And so this is a bit like the analogy from before,
170
170
00:09:15,470 --> 00:09:17,250
where this constructor function,
171
171
00:09:17,250 --> 00:09:19,560
is now the blueprint for a house,
172
172
00:09:19,560 --> 00:09:22,410
and then each of these objects that we create
173
173
00:09:22,410 --> 00:09:23,930
through that function.
174
174
00:09:23,930 --> 00:09:27,530
So through that blueprint will be the actual house
175
175
00:09:27,530 --> 00:09:28,763
in the real world.
176
176
00:09:29,820 --> 00:09:32,310
So in this case, the actual objects
177
177
00:09:32,310 --> 00:09:34,223
with actual data in them.
178
178
00:09:35,820 --> 00:09:39,690
So Matilda and Jack, and so of course,
179
179
00:09:39,690 --> 00:09:42,950
now each of them is its own new object
180
180
00:09:42,950 --> 00:09:44,950
that we created programmatically,
181
181
00:09:44,950 --> 00:09:46,683
using a function constructor.
182
182
00:09:47,570 --> 00:09:50,690
Now remember from one of the previous lectures,
183
183
00:09:50,690 --> 00:09:53,760
that in classical object oriented programming,
184
184
00:09:53,760 --> 00:09:57,810
an object created from a class is called an instance,
185
185
00:09:57,810 --> 00:10:01,860
right? Now we didn't technically create a class here
186
186
00:10:01,860 --> 00:10:04,070
because as we discussed before,
187
187
00:10:04,070 --> 00:10:06,550
JavaScript doesn't really have classes
188
188
00:10:06,550 --> 00:10:09,360
in the sense of traditional OOP.
189
189
00:10:09,360 --> 00:10:11,890
However, we did create an object
190
190
00:10:11,890 --> 00:10:14,270
from a constructor function.
191
191
00:10:14,270 --> 00:10:17,590
And actually three objects, right?
192
192
00:10:17,590 --> 00:10:20,150
And constructor functions have been used
193
193
00:10:20,150 --> 00:10:22,170
since the beginning of JavaScript
194
194
00:10:22,170 --> 00:10:24,750
to kind of simulate classes.
195
195
00:10:24,750 --> 00:10:27,270
And so therefore we can still say
196
196
00:10:27,270 --> 00:10:31,580
that Jonas here is an instance of person
197
197
00:10:31,580 --> 00:10:35,460
and the same goes for Matilda and for Jack here.
198
198
00:10:35,460 --> 00:10:38,370
And in fact there is even an operator
199
199
00:10:38,370 --> 00:10:40,853
that we can use to test for that.
200
200
00:10:42,400 --> 00:10:44,710
So that works like this.
201
201
00:10:44,710 --> 00:10:49,603
So Jonas is an instance of, and then person.
202
202
00:10:50,610 --> 00:10:53,573
And so this will then return either true or false.
203
203
00:10:54,550 --> 00:10:56,793
Now, if we created something else here,
204
204
00:10:57,820 --> 00:11:02,820
let's say J, just like this, then if we do this,
205
205
00:11:05,940 --> 00:11:08,990
this would of course be false, right?
206
206
00:11:08,990 --> 00:11:12,610
Because of course we didn't create this variable here,
207
207
00:11:12,610 --> 00:11:17,000
so this object using any constructor function, all right?
208
208
00:11:20,340 --> 00:11:23,283
And since we're talking about instances here,
209
209
00:11:24,260 --> 00:11:27,150
we can also say that these properties here
210
210
00:11:27,150 --> 00:11:29,223
will be the instance properties.
211
211
00:11:30,580 --> 00:11:31,853
Let's write that here.
212
212
00:11:32,810 --> 00:11:35,810
And that's because the properties' first name
213
213
00:11:35,810 --> 00:11:38,210
and birth year will be available
214
214
00:11:38,210 --> 00:11:41,040
on all the instances that are created
215
215
00:11:41,040 --> 00:11:43,113
through this constructor function.
216
216
00:11:44,220 --> 00:11:48,920
So that's for properties, but now what about methods,
217
217
00:11:48,920 --> 00:11:53,290
So what if we wanted to add a method to our objects?
218
218
00:11:53,290 --> 00:11:56,290
Well, just like we added properties,
219
219
00:11:56,290 --> 00:11:58,513
we can of course also add methods.
220
220
00:12:00,900 --> 00:12:04,483
So let's again, use our old friend calcage here.
221
221
00:12:05,410 --> 00:12:09,010
And so here we are going to create a function
222
222
00:12:09,010 --> 00:12:11,720
and assign it to this property.
223
223
00:12:11,720 --> 00:12:15,143
And so this will then basically become a method, right?
224
224
00:12:16,040 --> 00:12:20,640
And this year showed simply log to the console 2037,
225
225
00:12:20,640 --> 00:12:23,130
which is the year we've always been using,
226
226
00:12:23,130 --> 00:12:27,400
and then minus this.birth here.
227
227
00:12:27,400 --> 00:12:29,600
And so this method is exactly the same
228
228
00:12:29,600 --> 00:12:33,330
that we've been using all the time, right?
229
229
00:12:33,330 --> 00:12:36,840
So, this would work just fine here
230
230
00:12:36,840 --> 00:12:40,750
but this is actually a really bad practice.
231
231
00:12:40,750 --> 00:12:43,093
So you should never do this.
232
232
00:12:44,250 --> 00:12:46,580
You should never create a method
233
233
00:12:46,580 --> 00:12:49,520
inside of a constructor function.
234
234
00:12:49,520 --> 00:12:52,770
That's because imagine we were gonna create a hundred
235
235
00:12:52,770 --> 00:12:55,810
or thousands or even tens of thousands
236
236
00:12:55,810 --> 00:12:59,860
of person objects using this constructor function.
237
237
00:12:59,860 --> 00:13:01,550
Then what would happen,
238
238
00:13:01,550 --> 00:13:03,410
is that each of these objects
239
239
00:13:03,410 --> 00:13:06,113
would carry around this function here.
240
240
00:13:07,290 --> 00:13:09,460
So if we had a thousand objects,
241
241
00:13:09,460 --> 00:13:12,660
we would essentially create a thousand copies
242
242
00:13:12,660 --> 00:13:14,170
of this function.
243
243
00:13:14,170 --> 00:13:15,730
And so that would be terrible
244
244
00:13:15,730 --> 00:13:18,630
for the performance of our code.
245
245
00:13:18,630 --> 00:13:20,880
Again, don't do this.
246
246
00:13:20,880 --> 00:13:23,230
But instead to solve this problem,
247
247
00:13:23,230 --> 00:13:26,920
we are gonna use prototypes and prototype inheritance
248
248
00:13:26,920 --> 00:13:30,020
just like we discussed in the last video.
249
249
00:13:30,020 --> 00:13:32,140
All right, great.
250
250
00:13:32,140 --> 00:13:36,340
So this is the basics of constructor functions.
251
251
00:13:36,340 --> 00:13:39,020
Just note that function constructors
252
252
00:13:39,020 --> 00:13:43,070
are not really a feature of the JavaScript language.
253
253
00:13:43,070 --> 00:13:47,180
Instead, they are simply a pattern that has been developed
254
254
00:13:47,180 --> 00:13:48,890
by other developers.
255
255
00:13:48,890 --> 00:13:51,610
And now everyone simply uses this.
256
256
00:13:51,610 --> 00:13:55,490
And this now includes you as a new developer.
257
257
00:13:55,490 --> 00:14:00,260
So the real magic really here is this new operator.
258
258
00:14:00,260 --> 00:14:01,850
And so the most important thing
259
259
00:14:01,850 --> 00:14:03,650
to understand from this video,
260
260
00:14:03,650 --> 00:14:05,513
is really these four steps.
261
261
00:14:06,350 --> 00:14:08,660
So make sure that you understand them,
262
262
00:14:08,660 --> 00:14:10,150
and then in the next video
263
263
00:14:10,150 --> 00:14:12,220
we will work with prototypes
264
264
00:14:12,220 --> 00:14:14,430
and finally see the magic
265
265
00:14:14,430 --> 00:14:17,163
of prototypal inheritance in action.
23026
Can't find what you're looking for?
Get subtitles in any language from opensubtitles.com, and translate them here.