00:01
好,那到此为止了,函数高级部呢,我们就给大家说完了啊和这些东西在面试中啊,是问的比较多的啊,大家一定要多花点精神啊,下面一个呢啊,我称它为面向对象高级,其实这个里面倒是不东西不太多啊,也比较简单,我们先来看第一个叫对象创建模式,就是用各种各样的方式呢,我们去创建对象,我们来看一下。啊,首先第一种方式呢,我叫他object构造函数模式啊,现在我们要去创建出来一个人,他有name age对吧,他这种方式它的套路是什么呢?啊,先想办法去new一个什么空的object。接着再往这个对象里面动态添加我所需要的属性或者方法。
01:00
也是什么意思,P点内啊等于to对吧?还有p.a等于12对吧,我再好歹来个方法啊,P点等于function,传一个name.name等于name。算了吧,那这样我的一其实算在一起是不是也可以整,别的方法也可以整啊,表一下就可以,那现在呢,我就相当于用这种方式来创建了一个我所需要的一个对象。那下面呢,下面完全是测试,就测试你这个对象,看你能不能用了是吧,数据是是不是对的,那我先来一个set,它不有set name吗?来一下啊,换成Jack来我来去输出一下p.name P点。
02:00
是不是可以看一下啊,OK,甚至你把P输出一下也行,这太简单了。是不是可以啊啊,没有任何问题,是OK的。那。这一种套路它有一个啊认,因为我们要说是不是好几种创建对象的方式。那每一种创新对应方式呢,它有一个概念叫适用的一个什么呢?场景就什么样的情况下面适合用这种方式。是吧,先创建一个空对项,接着后面是不是动态的给它添加属性呢啊。这种适合于什么?就是开始的时候在起始,我是不是起始先创建一个对象。那为什么开始不就指定它的属性呢?那肯定是开始什么不确定要创建起始的时候,不确定对象内部的数据到底是多少,因为我不确定它的名字叫什么,我不确定它的年龄是多少。
03:03
分了吧。有没有这种情况?当然有啊,你比如说我现在是不是直接写这个内容,假设我的内容是通过一定的计算产生的,是不是有可能?是吧,A级是不是也类同啊,类似的它适用的场景,好下一个我们要看的它有什么问题的这种。他的不好的地方在哪里?是吧,我要创建出来这个对象,是不是写了这么多行啊,是不是写了好几条语句,一条两条,三条四条,是不是一共四条。是吧,那其实我们知道能不能把它搞成一条语句,可不可以可以。嗯。那至少你先要知道,我们当前这种写法,它是语句比较多的,那也就是说除了这种情况以外,其他情况我还用这种表达方式吗?
04:00
不要用,也就是说我们说这种方式是不是适用于这样一种场景,那除了这种场景外,是不是还有其他的场景,那其他的场景就不太适合用这种方式,因为它的语句太多了。那下面我们是不是要解决这个问题,怎么解决这个问题呢?啊,我们叫对象自变量的形式,什么意思呢?就是一个P等于一个大括号,直接给它指定什么name。可以吧,给他指定什么方法写什么方写这个呢,跟刚才代码其实是什么一样的。能看到,那请问我还需要做什么吗?我是不是够了呀,我这个对象是不是已经准备好了。是不是相当一步到位啊,是吧,这已经满足我的需求,我的需求还是这样的,还是需要去创建一个人需求没有变,对不对。
05:07
哎。这个套路就是使用大括号来创建对象,同时指定属性和什么方法。那下一步还是一样啊,测试下面实际上是测试啊好,那测试实际上是一样的,我现在去输出这个P点内和p.H这不必简单啊,这没什么太大好说的,这p.set内改一下,改成改成Jack吧,改一下接着是点p.name和p.a。可以吧,可以这简单。是不是可以啊啊没什么太多好说的,那你说这一这一次跟上一次比较,它有什么优势吗。
06:03
这是几条语句几条。你说一条两条,三条,四条,五条,六条,七条是几条语句,一条赋值语句,这不是一个对象吗?这个对象相当于是个表达式,能不懂啊,赋值给是不是这个P啊,这是一条语句,而我刚才呢。是不是N条语句多条语句啊,能不能看懂啊,也就是说现在我这种方式是不是能够解决这个问题,能不能因为多条语句变成一条语句吗?这不解决了吗?它适用的场景是什么?起始时对象内部的数据就已经什么确定了,那我创建对象的时候是不是就把它指定拉倒啊。
07:00
对不对对的,那他有没有问题了。他有一个问题,假设我现在我创建一个对象,我是不是还有可能创建别的对象,有没有可能来,我要再创建来我再怎么写啊啊,我一个PR等于。我是不是又要写一遍啊,我为了编码简单一点,我就直接就copy了啊。能不能懂,我是不是再写一遍?而我在创建地方的时候,正面你想想看,这两个代码是不是重复的。如果创建多个对象啊,代码很重复。这个代码还重复实现,是不是就是这种模式的一个问题啊,对不对。
08:00
啊,那你得想,你说老师既然有问题,还要他干嘛,没用了,但是你得想啊,有的时候我是不是就有可能只要一个对象就够了。有没有人有啊,我就一个。我没重复啊,我重复了吗?一个没有,一点都没重复。得看你是什么样的场景啊。如果创建多个,那确实有重复的代码,那如果创建一个对象就一点问题都没有。啊,这个记住。那但是呢,我们有的时候反过来说,我们有的时候又创建多个,而这种模式是不是有问题,那我们得是不是设计一种新的模式来去解决这个问题。啊,那下一个我们要说的啊,另外一个模式就是工厂模式。
09:02
来跟大家说一说工厂模式怎么用。来首先还是刚才那个需求啊,需求没有变,首先他要干嘛呢?通过工厂函数动态的创建对象并返回,那这里面就多了一个概念。什么工厂函数?何为工厂函数?那首先得是个函数对不对?工厂是用来干嘛的?是不是生产对象的呀?能不懂create老师?哪一个哪一个。我里面做什么呢,大家看啊,里面内,诶这不是是动态指定呢,还一个什么,我能不能有三一。
10:03
可以有,只是我没写而已,对不对,就要干个什么事。所OB,那何为工厂函数呢?返回一个对象的函数。都可以称之为什么呢?公差函数,大家想各位工厂是我每一次调用社会都可以得到一个新的立项,可不可以,可以,那这一个跟上一个比有什么好处呢?假设我现在创建两个人,我现在创建两个人怎么创建,大家看啊,创建两个人。对吧,一个P1等于是六是吧,叫什么传你这人所对应的姓名和年龄是吧,那我再要一个你写呗。
11:13
这个是什么?PR。可以,现在我创建两个人还复杂吗?代码量还多吗?不多。我是不是没有重复代码,人家老师咋没重复的,你这不重复的吗?那我就没辙了。这个重不重复是相对于我们这一种。能看到吧,这个啊,这两种方式还是有点不太一样的,对吧,能不能看出来,那这个模式就解决了我们上一种方式的一个问题。啊,OK,那它适用的场景就自然是我们需要多个对象,是不是采用这种模式。
12:02
其实这种模式不太用,为什么这种模式不太用了,是因为这个模式有一个很大的问题,什么问题了?好,我假设我现在要创建一个人,是这样找的,我现在还有一个函数用来创建一个,创建一个什么呢啊。啊,创建一个。还有什么东西是比较可爱的dog,行,Dog就dog吧,你你们想什么东西啊,创建个dog,这个dog有什么属性,你不要,你如果说名字和和好不了,我创建个学生好吧,这边那我有一个姓名有一个。
13:00
不爱吃什么东西,价格身价好一点,价格像卖人似的啊,或者说的更好的,就像卖身似的,你这是不对啊,那叫身价,说身价就感觉是吧,不一样,就问你身价多少钱啊,那他最终的钱是多少?好哎,不对啊,写错了是吧。还是一样啊,过一个OB等于一个是不是对象啊,接着name name,接着price,我我那个方法我都懒得写啊,方法不写好,接着改它什么return所O好,接着我握一个S等于。是吧,好,下面这什么,呃,张三,张三就再看吧。
14:08
好,来一个没去这样了吧,嗯,好了,现在我要说他的问题了,也就是说这一个是不是实际上要是一个学生,而这一个是一个人,他们类型一样吗?不一样,本身来说是不一样啊,但现在他们一能区别开来类型吗?区。能不能做个类型,不能,也就是说现在这两个,这一个什么呢?P1和P2都是什么类型,P1P2是类型懂不懂,好,那你的S什么类型仍然是。
15:02
那实际上大家想这里问题是什么?这一个对象没有一个概念叫什么具体的类型,你说他没类型,那不对,肯定是有类型的,没有具体确切的类型,但是你得想啊,有的时候我们需需不需要具体类型啊,需要。有的时候我说的,有的时候我们可能需要知道,你到底是个人还是个学生。对吗?能不能理解你说学生不是人吗?他是,但是我就把你当人看,好像把你当人看都好像不太好似的,是吧?啊,幸亏我现在还搞的学生,不是搞到狗猫什么东西了,对吧,我就把你当人看,那你的一些特性我是不是就看不见了,我就不知道啊,能不能理解啊,有的时候它是需要确定类型的。
16:09
那也就是说这种模式它也有它的一些问题,它的问题很简单,没有确切的类型,那现在假设我们需要确体飞行,我该怎么办?那你得定义类型了。能不能理解,你要想有趣的,也就是说我想创建学生,我就先得去定义学生这个类型对不对,能不理解,而这种方式我们把它称为什么呢?这个其实我们经常用。啊,自定义构造函数模式,这不咋用的吗?你说老师你这个模式这么好,你前面讲啥呀?啊不是啊,不同的场景下面用不同的模式。来,这个写法倒是非常简单,搞一个学生出来。
17:01
咋的?血是怎么啦,不是那个你。南方人不都这么说的吗?就有的时候说搞事知道什么意思吗?你就是找麻烦是吧啊找茬啊啊还是先先整一个人出来吧,别搞了这人这啊。好,我们整一个人出来,那其实就是内是吧,HZ点内等于内是吧?接是z.H等于H,接着再来一个this时,点set name等于一个方,接着来一个name,接着this your name等于name,我还有return,用不用不用啊,那下面我怎么写呢?
18:04
那其实啊,我这个到了这一步,我的需求已经完成没有。完成没有没有,因为我最终是要去模拟创建个人出来,我现在创建人出来吗?没有,现在我是不是只是定了人这个类型。下面是不是要创建他的实力,也创建个人出来。对吧?啊,我看下第一你有一个,你有一个person。是吧,我要再创一个人,是不是也可以,可以吧?我P点三能不能掉,来吧,来接着我去输出P啊,把和A都输出出来吧。
19:02
是不是可以啊,这没什么问题,其实代码大家都懂。但是我希望大家是一个整体的认识啊,不能还是停留在以前的认识的上面。那这种方式的区别跟上一种方式比较有什么好处啊?我创建多个人是不是一样啊,一样很简单对不对,但是问题就在于我现在我不又还要搞一个学生吗?哎哟,整一个学生是不是这个什么。Price this.name等于name this.price等于price,那我接着一个S等于六一个使student。13000,好,那你说现在我两个类型有没有具体类型,有它们类型还一样吗?不一样,我的这一个PE它的类型是什么,就看这个它事实上什么类型。
20:18
是吧,而我的这个S是什么类型?Student他们是两个是完全不同类型的。能不能看出?啊,那也就是说我这种模式是不是解决了上一种模式的问题,但他有没有问题呢?仍然还有问题。每个对象都有相同的数据浪费内存,什么相同数据啊,方法。什么意思,你看到我我了一个PR一个person。
21:02
我再搞一个啊,搞一个Jack,这这好像变不过来了,没办法,你别别在意啊,好,我们去输出P1,输出P2可不可以,可以我们来看一下这个P1和P2。打开。你来看。这两个数据肯定各自都要拥有,对不对?能不懂他们值不一样啊,能理解吧,但是。这个set name呢,值是不是一样的,是不是是一模一样的。而我每个对象是不是都存的相同的数据?浪费了吧,浪费内存空间咋办呢?想办法放在这个是什么圆形对象,这两个圆形呢,实际上是同一个吧。
22:03
我问大家,这是同一个对象,这两个是同一个对象吗?是还是不是不是啊,这两个不是同一对象。啊,这要搞清楚,但是下面的这个呢,这一个是指向的是不是同一个对象是。那现在我是要把这个函数放到这个对象里面去。就相当于我有两个海,有两个对象,他们的负对象是不是就是它的圆心对象,它们原对象是不是同一个,我要想办法把将它们共同的数据放到什么圆形对象上面去来。把这个捞一下。就是构造函数加原型的模式,先写个构造函数,但是不写这个,不在这里填,我这个里面是不是只是去初始化属性呢?就在故事函数里面。
23:06
在构造函数中。指什么?初始化一般属性那方法怎么办?那怎么写,大写等于。那有人说老师Z是圆形对象吗?是吗?我们说圆形的方法这个给谁用的,是不是给实例对象用的,而实例对象啊,才是我的这个认识吧,来怎么还是用法跟刚才还是一样用,是吧,我一个P等于六一个,或者用法没有变。
24:11
改一下吧,这个是什么加。那我们现在再去输出他们俩一个P,一个什么PR,我们来看一下这种方式。打开你的饭店。你看我每一个对象上面只有什么,是不是一般属性方法还在他身上吗?方法在哪呀,圆形上面。这不就是练练那个方法吗?那我问他,他们俩是同一个吗?是不是是。啊,这个要搞清楚。
25:00
其实讲以前我们就这么用过是吧,只是我们一点一点的走过来,大家应该看到啊,这个变化的过程。并不是说我们有人说老师这种方式应该最牛逼的。嗯。那是不是所有情况都用这种方式,不是说实话也不太在意,那有的时候我就把我就用这种方式。对吧,你要去写一个库啊,写一个库给别人反复的用,那你就讲究一点。那么呢,我要去定义一个构造函数,我要往里面加很多方法,会反复的用到,我要里面添加100个方法。那你就不太合适去放到那个构函数里面去出错了。能不能理啊?看你在不在意你的内存被多余的占用了,如果就个吧一个我不太在意,那你直接写在这里面,其实不犯法啊,记住了,你写的这里面不犯法的是这意思吧,啊,也不会报什么错都不会,只是说我们从省内存的角度,比如说老师我们还要省内存嘛,你程序员不追求这一点,你追求什么去啊。
26:16
能不能理解啊,这是这里面的几种模式啊,这几种模式里面跟大家说一下,也就这个怎么用。这个不怎么用,但是我主要是要通过这个事情让人知道工厂函数是什么,其实非常简单。你要知道工程函数这个概念是什么,其实非常简单,就那个函数,如果有个return能返回一个对象,那它就公法函数。其实每一次运行,它都能生产一个新的产新的对象出来。能理解吧,啊,其实非常简单,就看你啊有没有接触过的问题啊,我就希望把大家把这个概念给他接触一下。其他的每种模式都有用到。
27:02
啊,这四种。其实还有别的创建对象的模式,但是呢,我们现在暂时还没讲到啊,后面呢,需要的时候我们再给大家去说啊。OK,好,那对象的创建模式就说到这里,其实并不难啊,是这里面比较简单的东西了。
我来说两句