00:00
好的,我们继续来写这个数组的这样的一个变化侦测啊,那么数组的变化侦测的话呢,我们先从observer啊,咱们这个observer这个类啊,那么现在的话,他就要写一个特殊的。就是observe数组的一个方法。所以这里呢,如果是数组,要非常强行的蛮干。啊,将这数组的原型呢,指向a read method啊,Method啊,然后同时呢,我们现在还需要去,呃,让这个数组哎,变得是那个observe啊,所以这样的话呢,我们就需要调用一下自己的observe arra这个方法。啊,把这个数组我们给它弄下来,Value现在是数组啊,那这个方法呢,我们就需要定义一下,那这个就是数组的啊,特殊便利啊,我们现在把这个observe给加上。好,那么这个数组的特殊便利的话,你现在就明白了,这个是不是就相当于是,哎,我们这个嗯数组对吧?哎,这数组的话,我们就管它叫AR吧,然后在这里呢,我们就可以写for that I等于零。
01:11
好,然后按L等于啊,AR的Les,好,然后小于这个L加加。啊,那为什么我在这里不直接的把AR Les放到这呢?这是因为防止这个数组在遍历过程中它有一个长度的变化啊,一些特殊的情况,所以要这么写。好,然后这个时候呢,我们就逐项我们去便利对吧,哎,就是逐项。然后进行observe。啊,Observe咱们之前已经写好了,所以我这个时候就可以observe了,那么如果如果这个时候,嗯,就是observe是咱们引答如果如果你的某一项又是个数组啊,那没关系啊,那它是不是。又可以进行一个递归,在这里又是数组对吧?哎,是这样子的,那么这个地方我们就有一个observe a瑞了,那这个observe a瑞弄完之后呢,接下来就比较有意思的就是我们的这个A瑞JS当中,可能还要去调用到刚才的observe ara这个方法。
02:16
为什么呢?因为insert这个东西。啊,不是in此surprise这个东西呢,它非常的特殊啊,还有UN shift的这个东西也特别特殊,哎,还有谁非常特殊呢?就是这个push,哎,Push,然后还有什么UN shift,哎,还有surprise,这三个东西都非常特殊。因为这三个东西呢,它会往数组内部推入,或者说头部插入,或者说是在任意位置插入像,而这些像呢,也都必须是就是observed。明白吗?所以这个就是非常非常的神奇的一件事情,对吧?哎,所以这个时候呢,我我们啊,在这里就必须要去,对啊要去。
03:01
进行一些呃,特殊的操作。啊,那首先呢,在这里我们先去把这个上下文的OB取出来啊,把咱们这个数组身上的OB啊,杠杠OB取取出来啊,那么这个杠杠OB已经被添加了。啊,已经被添加了,为什么呀,为什么已经被添加了,添加了对,因为这个数组肯定不是最高项。啊,肯定不是最高层能理解吧,肯定不是最高层,就就就就比如我们那个OB勾的那个那个刚才咱们不是OB勾的技属性是一个数组吗。对吧,诶,这个这个这个属性是数组,那么OB勾本身一定不是数组,OB勾它不能是数组是对,而是对象,所以在第一次去遍历OB勾这个对象啊,对象的第一层的时候,就已经给这个G属性,就是这个数组。
04:03
明白吗?是不是就添加了什么呀,对,添加了杠杠OB杠杠这个属性。它是这样子的,大家发现了吗?它是这样子的啊,在这里就添加了这个值,所以这块的话一定是能得到,这个一定是能得到它的,所以我们就把它给得到杠杠OB杠杠啊,这是一定能得到的。然后得到它之后干什么呢?我们就在这里呢,要去啊区分就是在这里要定义吗?定义它之后,诶定义的话,我们要把这个OB我想想啊,嗯,这个要放到里头。啊,因为是我们要每遍历一个,每个方法重写的时候放在里头,这个要放在里头啊,它不是公用的。对吧,那这个时候我们要知道就是有三种啊,有三种方法就是push,哎,还有什么呀,UN shift。还有什么呀,叫Li对吧?哎,能够去插入心像,那现在呢,要把插入的心像啊,也要变为就是observe的,明白吗?那这个时候我们应该怎么办呢?对,我们就可以存一个light,叫inserted。
05:13
啊,那么他呢,嗯,就一开始是个空数组,哎,然后我们这个时候呢,就需要去呃,写Switch语句。Switch就是要来看一下咱们这个method的name到底是什么。啊,就我们在这儿不是有个循环吗?对吧,在循环里头我们要定义往它身上绑啊,绑的时候就要看这my name是什么啊,因为你这密不能写在外头。你写在外头的便历便利不了了,你也不能把Switch放在这儿啊,因为所有方法都要DEF,所以D内部写Switch是最合理的。对吧,哎,那如果这个时候是push。啊,或者这个时候是shift。啊,那这个时候要干什么呢?对,我们这个时候就要让inserted,哎,就等于你的arguments。
06:03
你仔细琢磨琢磨对吧,因为你push它的参数不就是它吗?好,然后我们就break,但是如果你这个时候是spli的话,那这个时候你的insert是不是就是你的下标为二的项开始。啊,所以说我们现在就取子数组二,哎,为什么,因为lie它的它的这个这个格式是什么,就是我要调用lie是不是下标。然后数量啊,我要连续改几个数量,然后才是插入的新项。对吧,所以说这个是下标为二的这个项开始啊。我要去取这个子数组,然后再去写break,然后在这里是判断有没有啊,有没有新啊,有没有要插入的新项,所以在这里就要判断,就是如果有这个inserted的话,就如果有,那我这个时候这块不是有个OB吗?对吧,诶这块就要有个OB,我就把这个OB给他弄进来,所以就是这个时候就需要把这个呃哦呃,不对,这个不用引爆啊,因为这个OB已经有了,这个OB是从他身上读的,那么OB它的原型上不是有这个observe arra方法吗?
07:16
对吧,咱们刚才写的这个observe这个方法,哎,然后我们把这个inser的给它加入,这样的话,我们就让这些新项,是不是让这个新项也变为响应的,对吧,哎,就OK了。啊刷新啊,这块不报错啊,就是说咱们现在这个数组现在是能够被你看这啦啦啦就生成了呀啦啦生成不就相当于被响应了吗?对吧?哎,因为你你现在改写了这些方法啊,改写了这些方法,然后他相当于里头所有项都相当于被被这个这个什么。啊,就被被这个,呃,就被监听成功对吧?哎,你你试图访问这个G属性啊,没问题,但他为什么没有说出你试图更改什么,因为他这个里头这个set get啊,他现在走的是这个observer的这个observer。
08:06
啊,然后在这里是observe它的。对吧,哎,Observe,然后诶observe这块是不是参数啊,没这是对吧,哎,观测它啊,然后他就每一个人都会有新的observer,所以他一层一层的就会去监测下去了。啊,一层一层的话就是相当于监测下去了,那么这样的话,我们这个数组的一个监测就正式的写完了啊那那那你说老师你怎么证明他写完了对吧,我g push,那那你说老师你这里不是也是呃,访问G的属性没有更改G吗?对吧?哎,对,这是因为我们并没有给重重新赋值,如果你给G重新赋值。那这个时候是不是就更改G。对吧,改变这啊,所以说它是引用类型值,引用地址没变,所以它是不会输出G属性被改变的,但是呢,这个时候确实我们留了个口。留了个什么口呢,就是这个啦啦啦。这啦啦啦是很重要的,就证明我们这个地方是允许啊,我们判断了咱们这个数组是不是在被更改。
09:06
对吧,哎,是这样子啊,当然这个函数现在要有个返回值啊,这个函数现在要有个返回值啊,返回的是,呃,你这个我看看啊,稍等啊,你要把这个original。然后我们在这里是要apply一下,对这块要有返回值啊,对你这个返回值肯定要返回啊,你这不返回返回值的话麻烦了,因为你有些值,比如说pop呀,它会返回被弹出的值,对吧?Li什么会返回被删出的值啊,所以这个返回值一定要有。好吧,哎,返回值一定要有啊,哎,就OK了,然后把这个恢复原来的功能可以放在上头。啊,这个恢复原来的这个功能可以放到最上头啊。哎,放在最上头就可以了,给他格式化一下,对。好OK了,哎,所以说你现在看这个啦啦啦啊啦啦啦是最重要的,就说明这块开了一个口啊,我们是可以允许咱们的数组现在也是被响应式的啊,就这块是被我们自己窃听进去了啊好,然后这块我们还以可以再测试一下,比如说PLA,它能不能真真正正的PLA呀。
10:14
对吧,哎,或者说咱们别,呃,咱们这样,你看我G,我surprise对吧,我从下边为二的项开始,我删一项,我给它改成一个数组。看见没有,哎,改成8899,那这样的话,我们来看一下这个对象啊,这个对象原来的这个argument is not function。发现了吗?哎,所以这个确实是有点问题,因为嗯,Plus的话arguments啊,对不起,Arguments这块是像。因为他要把8899插进去啊,这块有罗列,不能是数组啊,非常抱歉。还是报错,看看怎么回事啊。这块还是报错,看看报的是哪的错,报的还是这个S2,嗯,这块是怎么回事,Arguments的SLICE2。
11:01
Arguments arguments就是你的lies对吧,我这里调了一个lies。Li方法是这么用的吗?从下边为二的项一,然后在后边是罗列,然后我现在slice arguments。Arguments arguments。Arguments arguments slice is not function。嗯。Slice is not function。我们在这里是没有slis方法的啊,它应该是能够读取这个slas的这个方法的。诶,真的是很奇怪,难道。哦,Argument这个对象难道被改写了,这块确实出了点问题啊,我们输出一下这arguments啊。Arguments现在确实是有点问题,刷新看一下啊,这是arguments arguments的原型,咱们看一下pro pro,哎,果然发现了吗?这个arguments现在是个类数组对象,它这上面没有那个那些方法了。
12:07
发现了吧,哎,没有那个拉方法,所以说我现在还得给它变成数组。对吧,哎才行,我还得给他变成数组,我的天呐,那怎么把类数组对象变成数组呢?啊,那这会还真的是有点问题了,所以说我们现在就是把类数组对象变为数组啊,那就是Co的一个二二吧。哎,就等于嗯,点点点打开arguments,这样是不是就可以变成数组啊,这样行不行,然后把它给放到二对吧。诶刷新诶这回可以了啊,但这也二个。哎,那你看这个四四就没了,变成8899了,发现了,然后通知这个添加这个项也是有的啊,那如果说你这项被删掉了,改成一个数组,那这个时候这一项是不是也是8899,然后这个数组是不是也是被观察的。发现了吗?对吧,特别的神奇,那这样的话,比如说我现在就OB勾的G的,呃,下标为012的这个项,如果说我push一个100,那其实这项也能触发啦啦啦,发现了吗?这项,但是呢,你不能直接改某一项啊,咱们学过view的同学都应该知道,就是view中是不能直接改某一项的,你如果直接改某一项的话,它是不会触发啦啦啦的,看见没有。
13:20
他是不会触发啦啦啦的,因为直接改某一项,它不是七个方法中的一个。啊,它不是七个方法中的一个,只有调用数组的七个方法中的一个啊,然后这个时候呢,它才能去执行这个呃值,才能去调用我们刚才改写的那个函数。对吧?哎,所以那这个有同学知道,他要是使用这个Dollar啊,就是view的,呃,Dollar set这个方法对吧?哎,Dollar set方法,那这个Dollar set方法实际上也是改写的方法,我们后面再说啊,那实际上说他不能这么用的,他必须要去push。哎,所以咱们现在数组呢,就有一种递归啊,但是术语上不叫递归,就大概意思就是说它可以一层一层的都可以去监听啊,都可以去,就是都可以去变成响应式的啊,都可以变成响应式的OK了,对吧?哎,就完全没有什么问题啊,好了,然后大家呢,要把这个地方的话,也要去跟上啊,然后也要去给他写出来啊。
我来说两句