Would you like to inspect the original subtitles? These are the user uploaded subtitles that are being translated:
1
1
00:00:01,430 --> 00:00:03,800
Welcome back to the second part
2
2
00:00:03,800 --> 00:00:07,860
of the introduction to Object-Oriented Programming.
3
3
00:00:07,860 --> 00:00:10,870
And in this lecture, we will learn about OOP
4
4
00:00:10,870 --> 00:00:13,780
specifically in JavaScript.
5
5
00:00:13,780 --> 00:00:16,933
So, how it's different from the more traditional OOP
6
6
00:00:17,798 --> 00:00:19,350
and also different ways
7
7
00:00:19,350 --> 00:00:23,410
of implementing this paradigm in JavaScript.
8
8
00:00:23,410 --> 00:00:26,350
And don't worry, this will be a lot shorter
9
9
00:00:26,350 --> 00:00:27,583
than the last lecture.
10
10
00:00:29,490 --> 00:00:31,210
So, just to review.
11
11
00:00:31,210 --> 00:00:33,140
In the last lecture, we talked about
12
12
00:00:33,140 --> 00:00:36,280
the classical Object-Oriented Programming model
13
13
00:00:36,280 --> 00:00:41,280
with classes and instances created from these classes.
14
14
00:00:41,390 --> 00:00:44,870
And remember, a class is like a blueprint
15
15
00:00:44,870 --> 00:00:47,026
which is a theoretical plan
16
16
00:00:47,026 --> 00:00:52,020
and that we use to build many houses in the real world.
17
17
00:00:52,020 --> 00:00:53,350
And in the same way,
18
18
00:00:53,350 --> 00:00:57,940
the theoretical class can be used to create actual objects
19
19
00:00:57,940 --> 00:01:00,080
which are called instances
20
20
00:01:00,080 --> 00:01:02,503
and which we can then use in our cout.
21
21
00:01:03,350 --> 00:01:06,040
And this process of creating an instance
22
22
00:01:06,040 --> 00:01:07,883
is called instantiation.
23
23
00:01:08,960 --> 00:01:12,040
Now earlier, I said that in JavaScript
24
24
00:01:12,040 --> 00:01:14,640
things work a bit differently.
25
25
00:01:14,640 --> 00:01:19,540
So why did I first tell you about classes and instances?
26
26
00:01:19,540 --> 00:01:24,120
Well, it's because we do have similar concepts in JavaScript
27
27
00:01:24,120 --> 00:01:25,520
and so it's very useful
28
28
00:01:25,520 --> 00:01:29,570
to first understand the class instance model.
29
29
00:01:29,570 --> 00:01:33,710
Plus, many people also just use this terminology
30
30
00:01:33,710 --> 00:01:36,110
in the context of JavaScript.
31
31
00:01:36,110 --> 00:01:39,660
And finally, JavaScript syntax itself
32
32
00:01:39,660 --> 00:01:44,460
uses also some of these terms for example, instances.
33
33
00:01:44,460 --> 00:01:45,960
And so, you really need to know
34
34
00:01:45,960 --> 00:01:48,733
what a class is and what an instance is.
35
35
00:01:49,920 --> 00:01:54,920
Now, anyway, how does OOP actually work in JavaScript?
36
36
00:01:55,680 --> 00:02:00,150
Well, in JavaScript we have something called prototypes
37
37
00:02:00,150 --> 00:02:02,230
and all objects in JavaScript
38
38
00:02:02,230 --> 00:02:06,150
are linked to a certain prototype object.
39
39
00:02:06,150 --> 00:02:10,260
So we say that each object has a prototype.
40
40
00:02:10,260 --> 00:02:12,920
And now here comes the magic.
41
41
00:02:12,920 --> 00:02:17,400
So, the prototype object contains methods and properties
42
42
00:02:17,400 --> 00:02:21,530
that all the objects that are linked to that prototype
43
43
00:02:21,530 --> 00:02:24,270
can access and use.
44
44
00:02:24,270 --> 00:02:28,623
And this behavior is usually called prototypal inheritance.
45
45
00:02:29,480 --> 00:02:34,280
So, again, prototypal inheritance means that all objects
46
46
00:02:34,280 --> 00:02:37,550
that are linked to a certain prototype object
47
47
00:02:37,550 --> 00:02:40,040
can use the methods and properties
48
48
00:02:40,040 --> 00:02:43,360
that are defined on that prototype.
49
49
00:02:43,360 --> 00:02:47,470
So basically, objects inherit methods and properties
50
50
00:02:47,470 --> 00:02:51,220
from the prototype which is the reason why this mechanism
51
51
00:02:51,220 --> 00:02:54,310
is called prototypal inheritance.
52
52
00:02:54,310 --> 00:02:58,060
Just note that this inheritance is actually different
53
53
00:02:58,060 --> 00:03:00,520
from the inheritance that we talked about
54
54
00:03:00,520 --> 00:03:02,260
in the last lecture.
55
55
00:03:02,260 --> 00:03:06,150
So that was one class inheriting from another class.
56
56
00:03:06,150 --> 00:03:07,300
But in this case,
57
57
00:03:07,300 --> 00:03:11,610
it's basically an instance inheriting from a class.
58
58
00:03:11,610 --> 00:03:13,230
So that's very different
59
59
00:03:13,230 --> 00:03:15,150
and so keep that in mind
60
60
00:03:15,150 --> 00:03:17,150
or maybe in your notes.
61
61
00:03:17,150 --> 00:03:18,780
Alright?
62
62
00:03:18,780 --> 00:03:22,760
Now we can also say that objects delegate behavior
63
63
00:03:22,760 --> 00:03:25,440
to the linked prototype object.
64
64
00:03:25,440 --> 00:03:29,313
And behavior is just another term for methods here.
65
65
00:03:30,290 --> 00:03:32,960
So besides prototypal inheritance,
66
66
00:03:32,960 --> 00:03:36,090
we also call this mechanism, delegation.
67
67
00:03:36,090 --> 00:03:37,920
And that's also the reason why
68
68
00:03:37,920 --> 00:03:40,510
this arrow is pointing upwards
69
69
00:03:40,510 --> 00:03:44,290
because technically, objects delegate their behavior
70
70
00:03:44,290 --> 00:03:46,390
to the prototype.
71
71
00:03:46,390 --> 00:03:50,520
On the other hand, in classical OOP with classes,
72
72
00:03:50,520 --> 00:03:54,550
the behavior, so the methods, are actually copied
73
73
00:03:54,550 --> 00:03:57,130
from the class to the object
74
74
00:03:57,130 --> 00:03:59,790
and so that is completely different.
75
75
00:03:59,790 --> 00:04:02,080
Now, I don't want you to stress out
76
76
00:04:02,080 --> 00:04:05,770
about the exact terminology here, okay?
77
77
00:04:05,770 --> 00:04:09,730
So I know that this is a lot of new stuff to take in,
78
78
00:04:09,730 --> 00:04:13,180
so a lot of new words and new concepts.
79
79
00:04:13,180 --> 00:04:16,420
But this is just to paint a very clear picture
80
80
00:04:16,420 --> 00:04:19,130
and to give you the complete overview.
81
81
00:04:19,130 --> 00:04:20,480
What matters to me
82
82
00:04:20,480 --> 00:04:23,580
is that you understand how does prototypal inheritance
83
83
00:04:23,580 --> 00:04:25,200
actually works.
84
84
00:04:25,200 --> 00:04:28,380
Because, when we actually start using this in practice
85
85
00:04:28,380 --> 00:04:29,820
in the next lecture,
86
86
00:04:29,820 --> 00:04:31,180
it won't really matter
87
87
00:04:31,180 --> 00:04:34,270
if it's called inheritance or delegation
88
88
00:04:34,270 --> 00:04:38,550
as long as it just works as intended, right?
89
89
00:04:38,550 --> 00:04:40,840
But since you came to this course
90
90
00:04:40,840 --> 00:04:44,140
to learn how things actually work in JavaScript,
91
91
00:04:44,140 --> 00:04:47,050
I'm giving you all that information here.
92
92
00:04:47,050 --> 00:04:50,360
Even though for now it looks a little bit too much,
93
93
00:04:50,360 --> 00:04:52,983
but am sure you will find it useful eventually.
94
94
00:04:53,820 --> 00:04:57,060
So actually, we will come back to this diagram
95
95
00:04:57,060 --> 00:04:59,530
and fill it with some more detail
96
96
00:04:59,530 --> 00:05:04,100
after we have actually implemented prototypes in JavaScript.
97
97
00:05:04,100 --> 00:05:08,460
So after you have actually see how they work in practice.
98
98
00:05:08,460 --> 00:05:10,600
And by then, am sure that all this
99
99
00:05:10,600 --> 00:05:13,103
will make 100% sense to you.
100
100
00:05:14,090 --> 00:05:17,890
But anyway, we have actually already seen this mechanism
101
101
00:05:17,890 --> 00:05:20,380
in action many times before
102
102
00:05:20,380 --> 00:05:23,400
but without knowing that it was happening.
103
103
00:05:23,400 --> 00:05:26,860
For example, each time that we used an array method
104
104
00:05:26,860 --> 00:05:29,960
like map, we are able to use that method
105
105
00:05:29,960 --> 00:05:33,290
because of prototypal inheritance.
106
106
00:05:33,290 --> 00:05:36,920
So, when you go to MDN to check the documentation
107
107
00:05:36,920 --> 00:05:38,700
for any array method,
108
108
00:05:38,700 --> 00:05:41,410
what you will see there is that it's actually called
109
109
00:05:41,410 --> 00:05:45,330
array.prototype.map.
110
110
00:05:45,330 --> 00:05:47,580
But why is that relevant?
111
111
00:05:47,580 --> 00:05:50,000
So, what does this mean?
112
112
00:05:50,000 --> 00:05:53,940
Well, array.prototype is the prototype object
113
113
00:05:53,940 --> 00:05:57,700
of all the arrays that we create in JavaScript.
114
114
00:05:57,700 --> 00:06:01,860
So, just like this example array called num here.
115
115
00:06:01,860 --> 00:06:04,610
Now this prototype object contains all the
116
116
00:06:04,610 --> 00:06:07,510
array methods, including map.
117
117
00:06:07,510 --> 00:06:10,083
So, this is where they are actually defined.
118
118
00:06:10,970 --> 00:06:15,040
So, since array.prototype is the prototype of the
119
119
00:06:15,040 --> 00:06:20,040
num array, it means that num is linked to that prototype.
120
120
00:06:20,320 --> 00:06:23,610
And therefore, it has access to all the methods
121
121
00:06:23,610 --> 00:06:27,420
that are defined on the array.prototype object,
122
122
00:06:27,420 --> 00:06:30,040
just like the map method.
123
123
00:06:30,040 --> 00:06:34,860
So, in a sense, our array inherits the map method.
124
124
00:06:34,860 --> 00:06:39,280
Or again, we can also say that the array delegated
125
125
00:06:39,280 --> 00:06:42,900
the behavior of mapping to its prototype.
126
126
00:06:42,900 --> 00:06:47,150
So, you can choose whatever makes more sense in your mind.
127
127
00:06:47,150 --> 00:06:49,640
But what matters, is that the map method
128
128
00:06:49,640 --> 00:06:53,690
is actually not defined on the num array itself
129
129
00:06:53,690 --> 00:06:55,820
but on its prototype.
130
130
00:06:55,820 --> 00:06:58,640
And of course, we're gonna check out this behavior
131
131
00:06:58,640 --> 00:07:01,559
also in our cout and practice,
132
132
00:07:01,559 --> 00:07:02,392
okay?
133
133
00:07:04,255 --> 00:07:08,060
Right now, you might have a ton of questions
134
134
00:07:08,060 --> 00:07:09,510
in your head.
135
135
00:07:09,510 --> 00:07:13,260
Like, how do we actually create prototypes?
136
136
00:07:13,260 --> 00:07:16,680
And, how do we link objects to prototypes?
137
137
00:07:16,680 --> 00:07:20,590
And how can we create new objects without having classes
138
138
00:07:20,590 --> 00:07:24,010
from which we can instantiate objects?
139
139
00:07:24,010 --> 00:07:26,630
So, in summary, the question is
140
140
00:07:26,630 --> 00:07:29,550
how do we implement Object-Oriented Programming
141
141
00:07:29,550 --> 00:07:31,973
in JavaScript in practice?
142
142
00:07:32,820 --> 00:07:36,520
Well, in JavaScript there are actually three different ways
143
143
00:07:36,520 --> 00:07:40,420
of doing all this: the constructor function technique,
144
144
00:07:40,420 --> 00:07:44,607
ES6 classes and also the Object.create().
145
145
00:07:45,660 --> 00:07:49,100
So first, constructor functions are a way
146
146
00:07:49,100 --> 00:07:51,790
of creating objects programmatically,
147
147
00:07:51,790 --> 00:07:54,650
using a function which will also set
148
148
00:07:54,650 --> 00:07:57,140
the new object's prototype.
149
149
00:07:57,140 --> 00:08:00,770
And this is actually how built-in objects like arrays
150
150
00:08:00,770 --> 00:08:04,760
or maps or sets are implemented.
151
151
00:08:04,760 --> 00:08:08,870
Also, this is how OOP has been done in JavaScript
152
152
00:08:08,870 --> 00:08:10,573
basically since the beginning.
153
153
00:08:11,530 --> 00:08:16,530
Next, the ES6 release introduced classes into JavaScript.
154
154
00:08:16,600 --> 00:08:21,210
And so now, ES6 classes are actually the more modern way
155
155
00:08:21,210 --> 00:08:24,370
of doing OOP in JavaScript.
156
156
00:08:24,370 --> 00:08:27,270
However, keep in mind that these are actually
157
157
00:08:27,270 --> 00:08:30,210
not the kind of classes that we talked about
158
158
00:08:30,210 --> 00:08:33,810
in the last lecture and in the last slide.
159
159
00:08:33,810 --> 00:08:37,302
They are instead just so called 'synthetic sugar'
160
160
00:08:37,302 --> 00:08:40,020
over constructor functions.
161
161
00:08:40,020 --> 00:08:43,940
So this means that ES6 classes are basically just
162
162
00:08:43,940 --> 00:08:48,270
a layer of obstruction over constructor functions.
163
163
00:08:48,270 --> 00:08:51,200
So, it's really just a nicer syntax
164
164
00:08:51,200 --> 00:08:56,200
that makes it easier for newcomers to do OOP in JavaScript.
165
165
00:08:56,370 --> 00:09:00,810
But behind the scenes, ES6 classes are actually implemented
166
166
00:09:00,810 --> 00:09:02,930
with constructor functions.
167
167
00:09:02,930 --> 00:09:06,050
And so they also use prototypal inheritance
168
168
00:09:06,050 --> 00:09:08,183
just like we learnt in the last slide.
169
169
00:09:09,380 --> 00:09:12,610
Finally, there's also the object.create()
170
170
00:09:13,480 --> 00:09:18,120
which is basically the easiest and most straightforward way
171
171
00:09:18,120 --> 00:09:22,250
of linking an object to a prototype object.
172
172
00:09:22,250 --> 00:09:25,990
However, it's not as used as the other two methods
173
173
00:09:25,990 --> 00:09:28,653
as we will see over the next couple of lectures.
174
174
00:09:29,590 --> 00:09:33,260
Now, to finish, one important thing to keep in mind
175
175
00:09:33,260 --> 00:09:37,240
is that the four principles of Object-Oriented Programming
176
176
00:09:37,240 --> 00:09:39,440
that we learnt in the last lecture,
177
177
00:09:39,440 --> 00:09:43,180
so that's obstruction, encapsulation, inheritance
178
178
00:09:43,180 --> 00:09:47,000
and polymorphism are still valid and important
179
179
00:09:47,000 --> 00:09:49,700
with prototypal inheritance.
180
180
00:09:49,700 --> 00:09:51,580
And throughout this section,
181
181
00:09:51,580 --> 00:09:53,540
we will of course learn how to use
182
182
00:09:53,540 --> 00:09:56,616
and implement these principles.
183
183
00:09:56,616 --> 00:09:57,449
Alright.
184
184
00:09:57,449 --> 00:09:59,670
And with all that being said,
185
185
00:09:59,670 --> 00:10:03,300
let's now finally put OOP into practice
186
186
00:10:03,300 --> 00:10:05,393
and get a bit more technical.
16306
Can't find what you're looking for?
Get subtitles in any language from opensubtitles.com, and translate them here.