00:00
好的,各位在学习完了函数式组件之后呢,按照顺序啊,我们其实应该学习类式组件,但是考虑到大家呢,可能对类相关的知识啊都有所遗忘了,所以说接下来呢,我们回忆一下类相关的基本知识,回到代码当中,新建一个文件夹啊,就要复习的同学,所有我带着你复习的代码呢,我都写在这个里边,回头呢,你好,有一个参考,右键新建一个文件夹,一下划线,诶,叫做类的基本知识点HTML,准备好这个文档,把名字呢,我给它复制过来,写好script标签,同学开门见山啊,不墨迹,我想创建一个person类去表达一些人的信息,那你说我得怎么写定义类的关键字是class,你还记得吧?啊,那直接写花括号就定义好了一个类,对吗?哎,也就是说,你写完了十、11、12这三行。
01:00
当代码直接定义好了一个person类,写好注释,创建一个person类,OK,那同学类我们一般怎么用啊?是不是用它去创建实例对象啊?好了,写代码创建一个person的实例对象,给实例对象起一个名,比如说叫PE,怎么出来呢?用new关键字有一个personlo,输出这个PE,我们来瞧一眼。控制台上键刷新,同学,我想问的是输出的到底是不是P?一说,老师,是啊,那我问你P是谁啊?是person的实例对象,但是同学我怎么觉得好像把类输出了呢?你看这不是大写的a person吗?你P那不是小写的吗?哎,那我说一下啊,同学,是这么回事儿,这个红色框的东西啊,代表着你输出的确实是一个实例对象,这个蓝色的代表什么呢?你这个实例对象是由谁拗出来的?
02:09
哎,所以说千万别把自己绕进去,老师,我把类输出了什么呀?你输出的是一个实例对象,这个实例对象是由person这个类所拗出来的,OK,为什么他要这样做呢?前边为什么这么麻烦,非得带一个大写的person呢?直接输出这个挺好的嘛,对吧,干净利落的,那我说一下啊,可能存在这么一种情况,你除了有一个person类啊,同学,你还有一个狗,这个类叫做dog,那你又弄出来一个狗的实力,你拗的是dog,你输出了这个第一同学回到控制台去看,你说如果没有前边的这个东西啊,再告诉你这个实例是由谁拗出来的,那你觉不觉得你有点人畜不分了呀?哎,所以说呢,同学别把自己绕进去啊,输出的确实是实力,前边代表他是谁缔造的?OK,把狗这个类删掉,把这呢也删掉。
03:03
好同学,我再来一个人啊,叫P2,再输出这个P2。觉不觉得这两个人长得完全一样?同学,你说人最起码也得有自己的名字和年龄吧?啊,那所以说呢,我想对实例进行一些初始化的操作,你就比如说每个人有一些独有的信息,那怎么办呢?你就得传进去,比如说第一个人呢,名字叫做Tom,年龄是18岁,那么第二个人呢,叫做Jerry,他的年龄呢,是19岁,传没传传了?朱老师传了那就有了,谁说的呀,你得接对吗?那怎么接呢?来到类里边,同学要接住new时候,传递过来的参数你得接住一个人,不知道你还记不记得了啊同学,叫做构造器函数,或者说叫做构造器方法对吗?啊,因为类里边不是分为属性和方法嘛,对吧?哎,来吧,同学,那接下来怎么办?关键字是constructor,走,你传递了TOM182个参数,那人家其实就能收到两个,那当然你用A和B是不是不合理呀,Name还有age。
04:13
好,那接下来怎么办?是不是把传递过来的name和age放到实例自身呢?啊说老师,那我怎么写呢?那你想啊,你可能有多个实例,那你这里面写谁呢?你写谁好像都不合适,对吗?啊用一个关键字就是this,所以说我们经常写这段代码,this.name等于name,那同时呢,还有这个this age等于age。好了,同学,那我问你啊,构造器中的this是谁呢?写好注释,构造器中的this是谁我知道啊,可能有一些同学呢,就很自然的就写出这段代码了,但是实际上你并未懂,你知道吗?哎,构造其中的this是谁啊?一句话类的实例对象说,老师,那是哪个实例对象啊,那我看你当时扭的是谁?
05:01
你第19行,那this指的就是P1,你第20行,那this指的就是P2,对吧?我看你拗的是谁吗?好了,朱老师这就能放到自身了。是的,回头来看,打开网页来控制台刷新,你看每个人是不是有了自己一些独有的信息,那我想跟大家较个真儿,我这构造器你说可不可以不写?说老师不写那名字和年龄不是就收不到了吗?那同学举个例子,我就不想让他们每个人都有什么名字和年龄啊,对吧?你说能不能不写这个构造器,其实是完全可以不写的,但是吧,话又说回来,就以咱们现在这个person类,他没有继承任何别的类,它就自己,哎,我就是一个person类,你还不写构造器,那你这个类呢,就多多少少吧,它有点没啥意义,你觉不觉得啊?同学是理论上你可以不写,但是你看这些人长得都一样,还没有自己一些独有的信息,对吗?哎,那所以说呢,理论上是可以不写的,但是目前就我person这个类来说,好像写上更好,对吗?啊,一会儿有继承的时候,咱在继承里边再单独聊这构造器,OK,好了,同学啊,那人呢,就拥有了这些属性,你看名字呀,年龄啊,同学,人好像还有行为吧,那你说行为是不是对应我们编码里的什么东西,是不是叫方法啊?那人能干嘛呢?想想吃饭睡觉。
06:25
啊,不打痘痘是吧,打代码,那所以说给他写点人的行为吧,也就是方法,嗯,那我们这里呢,称为一般方法老师,什么叫一般方法呀,就是除了这个构造器方法呀,剩下的那些程序员根据业务场景自己去写的都叫做一般方法,你比如说来吧同学,人是不是能说话呀,那我就定义一个说话的方法,Speak得这么写吧,定义方法,哎,OK,你可这别给我来一方啊,那你这遗忘的可有点严重啊。同学来speak,我想让这个人呢,说出自己的年龄和名字,那用一句coolo去代替我直接使用ES6里的模板字符串啊,然后呢,写好一个模板,我叫什么什么啊,然后我呢年龄是多少多少,那同学你说这怎么写,你P1说话就得输出P1的Tom是八,你P2。
07:25
说话呢,那就得是JERRY19对吗?那我教,诶这怎么写呀?哎,直接写啊,到了福啊,英文的,诶英文的到福走this点谁名字对吗?我的年龄是到福花括号this.age对吗?好,我们先看一下效果啊,前两行呢,我先不注掉,分别输出P1P2这两个实例,P一来说话,P2来说话,走回到控制台看最后两行输出,他们真的分别输出了自己的信息。好了,回头琢磨一下,同学,Speak是类中的一般方法对吗?那我想问你一个问题啊,回到控制台上,我并没有在他们的身上看见说话这个方法呀。
08:20
有年龄和名字我承认,但是我并没有看见他们实力自身有speak说话这个方法呀,说老师那你是没展开,那我展开看也没有啊,那所以说第一个问题,同学我写的注释,你思考着就是speak方法放在了哪里,嗯,Speak方法放在了哪里呀?哎,一句话,同学是person这个类的原型对象上啊,那我就直接把这块复制过来吧,叫做类的。圆形对象上,好,我们看一下啊,同学你说这不就是圆形链的查找规则吗?当你去读取了属性,自身不存在的属性,或者是调用了自身不存在的方法,那是不是沿着圆形链去找下去啊,然后打开走,Speak是不是在这儿呢?OK啊,所以说第一个问题我们搞懂了,那么第二个问题,同学我再追问一句,Speak方法是给谁用的呀?我写成一行吧,给谁用的呀?放在原型对象上的方法,同学你说是给谁用的呀?是不是给实例用的呀?那同学你看嘛,你通过谁调用到的speak呀?是不是那两个实例?好了,补一句话叫做公实例使用,OK。
09:45
好,哎,然后呢,同学再考虑另外一个问题,就是speak中的this是谁?那刚才你都看见了同学他都能正常的输出自己的名字和年龄了,你告诉我吧,这this是谁呀,谁呀,是不是P1或者是P2啊,那我得看你具体是谁点的speak对吗?好,哎,那咱们补一句话吧,这么写叫做通过person实例调用speak时,Speak中的this就是person实例啊,你想你都通过person实例去调用的嘛,同学,PE是不是person实例啊,是那里边的this是谁?就是这个APE1呗,那PE是谁呀?那person实例呗。
10:45
OK,哎,所以说这块呢,你一定要搞懂,但你这不能说死同学,你这样说就不太合适,你直接来一句speak中的this就是person实例,谁跟你说的呀?这可不一定啊,同学,来,我给你测试一下p.speak点靠,然后呢,我传了一个对象,A是一属性B为二。同学呢,你看一下我掉没掉speak,嗯,掉了是pe.speak我是不是用靠调用靠有一个最重要的功能就是更改函数里的this指向,你传什么我就改成什么,对吗?那所以说你看最后一行输出,同学没年龄了,也没有名字了,为什么呀?因为你更改了它的this指,所以说同学一句话,Speak中的this到底是谁,我得看你是怎么调用的。回想一下咱之前讲如何判断函数中的this,同学你怎么判断?
11:45
是不是得看看这个函数是怎么调用的呀,你这就是属于,哎,什么对象点调用,或者是实例点调用,这就属于靠调用,那还有谁呢?还有apply,还有band,对吗?都能更改this的指向,OK,诶,这会你要知道,所以说我们得写的完整一点啊,同学,撤回来撤回来走,虽然显得很磨叽,但是把这个事情呢较真能说明白,通过person实例调用speak,那么speak中的this思就是person实例,OK,好的,那这就是,哎,正常去回忆一些类相关的知识,里边还有一个同学叫继承,你这只是玩一个类对吗?有一个概念叫做继承,我接下来呢,把这些代码呢删掉,回头呢,你自己可以随意的去创建实例,随意的去玩,哎,去看它,好。
12:32
说说继承这个概念,先把这个person类呢,给它折叠起来啊同学,我还想定义一个类,这个类的名字叫做student,这个类呢,像继承person,那所以说写好吧,创建一个student类,然后呢,继承于personally OK class student继承那个词叫继承谁呢?Person,好,哎,得这么写,同学,你这一继承不要紧啊,你的student。
13:13
就可以拥有person speak方法了,你在new一个student的时候,也可以正常的给他传名字和年龄。说老师那你这个student还没写构造器呢,同学,我问一下必须要写吗?不是来我们测试一下啊,Costa建立一个学生的实力,一你有一个student走。同学,学生呢,比如说叫做小张,我传没传名字啊,传了,那我再传一个年龄,比如说呢,他是15岁,好有名字有年龄传了对吗?Klo输出这个SE我知道啊,现在你可能有点疑问老师,不对的,你这new student的时候传了参数,那你这也没用构造器去接呀,那我说一下同学,这构造器呢,我都不想写了,因为你已经继承这个person了,Person的构造器里边已经能接收到这个name Asia,那这个子类呢,这个student,哎,叫子类,直接就把父类的构造器搬过来就直接用了,那不信你瞧瞧看保存同学。
14:23
是学生实力不是的,有名字不有年龄不OK,所以说同学你觉不觉得对于学生这个类来说,这个构造器貌似我就可以不写对不?哎,所以说构造器不是一个必须要写的东西,说老师,那你说对于student这个类,什么时候我需要写构造器呢?那想一下啊,同学人呢有名字和年龄,学生也有名字和年龄,但是学生呢,要比普通人多一些属性,你比如说学生有一个属性叫做年级啊,不是年纪,是年级,你是高一的还是高二的,你比如说来,我传一个小张呢,15岁,15岁,那就是高一吧,咱随便写一个,说老师呢,他身上就有一个年级属性是高一,谁说的呀,没有为什么呀。
15:12
因为student继承了person person这边只能收到name和age,你觉得呢,同学他收不到别的呀,啊说老师我知道了,就我传的东西,那这边他没接住啊对,说老师那我接一下不就得了吗?年级啊G这单词,说老师这不就哎你等等啊干嘛呢,直接改person呀,不太合适吧,人没有这个年级啊,啊也是哈,那所以说呢,同学不卖关子了,你应该在student里边写构造期,那我问一下刚才为啥没写。因为student身上的属性和person和他继承的那个人是一样的,那你就不用写吗?但是如果他身上想有一些自己独有的东西,哎,那你就得写构造器了是吧?那由于你是按顺序传的,所以说这边呢,你必须得按照顺序接name age,年级啊,说老师,那我知道了,接下来呢,我就可以自己写了,复制不都是这个套路吗?我再补一行,哎,年级等于年级,老师,这我就可以了,那你看看你的代码吧,报错,只读这三个词就够了,Must call super什么意思?Super必须调用。
16:27
说老师什么意思没懂呢?来,回头看,你是不是定义了一个student类对,你是不是继承了person对,你里边是不是写了构造器对,当你符合了这三个条件之后。你的构造器中必须调用super,你不调用就会报错,这个是类里的一个语法,不允许你不写super,说老师,哎,那我要连构造器都不写呢,哎,那算你赢了,构造器你都不写,那你就可以不写super了,他也不报错,但是你不写构造器,我问你年级你是不是丢了呀?所以说构造器要写上,那同学你觉不觉得,其实我在学生这个类里边写构造器,我就是为了接住学生所独有的那个年级。
17:16
对吗?说老师,哎,那就这样吧,我就写super,那super是干嘛的呀?它帮你调用负类的构造器,什么意思呢?打开同学看这啊,你觉不觉得这两句话和这两句话有点重复,那你讲这么一个问题,学生和人啊,他俩之间呢,肯定是一个继承的关系,那你想一下,人如果有40个属性。名字、年龄,是否婚配,手机号、家庭住址、身份证号等等很多的东西,就40个属性,学生继承了person,难不成你在这儿再写40行this,点什么等于什么不太合适吧?所以说,哎,人家希望你这么做,别自己在这写,用super把你接到的名字age,也就是说学生和人所共有的那些属性,你通过super给父类的构造器递过去,他负责帮你去做这些事儿。OK,好了,保存你的代码,回头来看,一切正常。有名字,有年龄,也有年级,对吗?那这里有一个细节上的问题,同学,Super必须得放在所有人之前,不允许放在其他人之后。说老师,我放在这儿,这不也掉了吗?我先把自己身上的加上,回头我再挨写,这个不行。
18:33
啊,必须得在最开始去调用super,好了,扯回来啊。说老师那这就说完了,没完,同学你是啊,出来了一个学生的实力东西也都在,那我想问的是由于你写了继承对吧,你说学生也就自动的也可以去调用speak,哎,那也就说这就是继承的威力所在对吗?让子类也可以使用父类原型上的方法,那咱们就仔细聊聊啊同学,我现在输出的是不是S1学生这个实力啊,他自身有什么属性啊,名字年龄年级,那你回头来看也确实是有打开也是这么多。
19:17
那同学我想问一下,你说学生的原型对象上有东西吗?有没有你自己写的一些东西,你比如说刚才人这个类里边,你是不是写了一个speak,那你看咱分析了一波,说speak方法放在了哪里,是不是类的原型对象上啊,是不是供实例使用啊?哎,那我想问的是,目前来说,对于student这个类的原型对象上有没有一些什么你自己写的呢?答案是没有的,因为你确实没写吗?如果你写了这个,OK,我承认它的原型上有一个DEMO方法,那不信你瞧吗?打开原型是不是有DEMO啊?那当然了,构造器是在原型上的啊。好,同学,那考虑一个问题啊,我如果把DEMO删下去,你保存,那么貌似student的原型对象上好像也只剩一个构造器了,那我想问的是,学生到底能不能说话呀?
20:12
老师,我还真不知道了,那试试吧,S一点来speak让他说话,注意观察。学生呢,成功的说话了,对吗?那怎么说的呢?首先自身没有speak说话那个方法,自身没有怎么办啊?那找其缔造者,缔造者是谁?你输出的是student实力,那么它的缔造者当然就是student这个类,对吗?找其缔造者的原型对象,一找是不是找见了,但是原型对象是找见了,原型对象里边有你需要的speak吗?没有,那怎么办呀?原型链儿吗?所以说继续查找,就找到了副类的原型对象里边的speak就找到了。哎,那所以说学生呢,是可以说话的,那也就是说同学从头到尾其实只有几个speak一个,我不管你是人的实力在掉,还是学生的实力在掉,掉的都是那一个speak,那所以说这就是哎,为什么人要往原形链上放一个。
21:12
Speak大家都在用,这不就是复用吗?OK,好的同学,事情并没有到此结束,学生啊,确实调用到了父类原型上的这个说话方法,说出了自己的名字和年龄,但是我有一个小要求,我想让学生呢,再多说出一个信息,因为学生是比人多了一个年级的,我想让学生说话的时候呢,除了说我叫什么,我的年龄是什么,再补一句,我正在读,哎,哪一个年级,哎呀,说老师,那这怎么写呢?那你还能借助原来副类原型上的speak吗?那就不能了,说老师那怎么办呀,那就得需要你自己写一个了speak,哎,在学生这里边,哎自己也有一个speak,那就把这个呢给他拿过来。除了说出这些,我再补一句逗号,我读的是grade年级。
22:17
对吧,好了,你再让学生说话,这回你瞧瞧,诶,是不是多了这句话呀,同学,我们管这叫什么呢?重写从父类继承过来的方法,好的,那同学我问你这回student的原型对象上有没有一个方法叫speak,有来我们看一下,这是学生的实力,对吗?自身没有speak原型上有没有有,如果你要再找下去,其实这是不是也有,但是你要明白的是,蓝色的是student实例能直接调用的这个,那也就是说其实这个蓝色的在哪呢?在student这个原型对象上的,那这个红色的其实它在哪呢?在person的那个原型对象上,那么按照原形这查找的规则,其实他查找到这一步就找见了,找见了就直接调用了,还往下看吗?不看了,OK,好,那同学我再。
23:17
说一下学生啊,还想有一个自己独有的方法叫学习好study学习对吗?好colo,呃,就说出一句话吧,我很努力的学习好的,那同学你说S1它就可以调用学习这个方法一调用,那就哎,我很努力的学习,那我想问大家两个问题啊,咱开玩笑的说是吧,灵魂两连问我问你study放在了哪里?Study放在了哪里类的原型对象上供谁使用实例使用啊,那在第二个问题,通过谁student实例调用study是,那么study中的this就是student实例,你说对吗?
24:17
你不能直接说死,你得说你怎么掉的,我的this它就是谁对吧?好,哎,那这个呢,就是跟类相关的概念,那么在最后的最后我们进行一个总结吧,好吗?同学们,那我把这些测试代码呢,我都删掉啊,从头到尾呢,其实我就是定义了两个类而已,对吧?同学们,哎,那我先声明啊,并没有说带着大家把类所有的东西全都复习一遍,那要全都复习一遍,一个小时都打不住,我们只是说复习一下,接下来我可能会用到的。OK,好了,同学啊,来一波小总结,就是这么多的代码写完了,你对类应该有这么几个认识啊,来一个小小的总结,就三点啊,首先第一点,类中的构造器是必须要写的吗?不是的,写好类中的构造器,同学啊,我在这敲,你用脑子呢,也再过一遍,OK啊,类中的构造器不是必须写的,好,再往后说。
25:17
那什么时候写呀?要对实例进行一些初始化的操作,如添加指定属性时,然后咋的才写?哎,啊,不是这才写啊,才写好。啊,那这儿呢,给它删掉吧,同学们你想想,对于学生来说,我之前没写构造器吧,他是不是也可以拥有名字和年龄啊,但是说你想做一些初始化的操作,你比如说同学,学生都想有一个哎年级,那你就得自己去来了,对吧?啊,OK,同学,那你说哎,这么写啥意思呢?正好聊到这了,我这么写啥意思呢?this.school等于上硅谷什么意思?嘿,你这个意思就是所有由student缔造的实例啊,身上都有一个属性,名为school,值为上硅谷,对吗?说老师呢,不需要再传进去了,不需要传了呀,这也不需要接了呀,对吧,我的设计就是所有他缔造的学生,那都是上硅谷这个学校的,OK,那就可以这么写吗?那行,给它补在这儿好了,我们再总结第二点叫什么呢?关于刚才那个super的问题来写一下啊,大家容易遗忘,如果。
26:38
A类继承了B类,哎,体会且呢,A类中写了谁呢?构造器,这是前提啊,你得有继承,而且你的这个类中还得写个构造器。那么A类中的。啊,A类构造器中是必须要调用的,好,我们再说第三点。
27:15
类中定义的方法其实是放在了哪儿呢?都是放在了类的原型对象上啊,供谁去使用啊,哎,也就是说speak study都是放在原型对象上的,好,那么对类基本知识的复习呢,我们就复习到这。
我来说两句