All language subtitles for 4. OOP in JavaScript

af Afrikaans
sq Albanian
am Amharic
ar Arabic
hy Armenian
az Azerbaijani
eu Basque
be Belarusian
bn Bengali
bs Bosnian
bg Bulgarian
ca Catalan
ceb Cebuano
ny Chichewa
zh-CN Chinese (Simplified)
zh-TW Chinese (Traditional)
co Corsican
hr Croatian
cs Czech
da Danish
nl Dutch
en English
eo Esperanto
et Estonian
tl Filipino
fi Finnish
fr French
fy Frisian
gl Galician
ka Georgian
de German
el Greek
gu Gujarati
ht Haitian Creole
ha Hausa
haw Hawaiian
iw Hebrew
hi Hindi
hmn Hmong
hu Hungarian
is Icelandic
ig Igbo
id Indonesian
ga Irish
it Italian
ja Japanese
jw Javanese
kn Kannada
kk Kazakh
km Khmer
ko Korean
ku Kurdish (Kurmanji)
ky Kyrgyz
lo Lao
la Latin
lv Latvian
lt Lithuanian
lb Luxembourgish
mk Macedonian
mg Malagasy
ms Malay
ml Malayalam
mt Maltese
mi Maori
mr Marathi
mn Mongolian
my Myanmar (Burmese)
ne Nepali
no Norwegian
ps Pashto
fa Persian Download
pl Polish
pt Portuguese
pa Punjabi
ro Romanian
ru Russian
sm Samoan
gd Scots Gaelic
sr Serbian
st Sesotho
sn Shona
sd Sindhi
si Sinhala
sk Slovak
sl Slovenian
so Somali
es Spanish
su Sundanese
sw Swahili
sv Swedish
tg Tajik
ta Tamil
te Telugu
th Thai
tr Turkish
uk Ukrainian
ur Urdu
uz Uzbek
vi Vietnamese
cy Welsh
xh Xhosa
yi Yiddish
yo Yoruba
zu Zulu
or Odia (Oriya)
rw Kinyarwanda
tk Turkmen
tt Tatar
ug Uyghur
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.