2020/02/09 05-高阶类

在这里插入图片描述
高阶对象或高阶类,采用了一种Mixin方式,跟python的Mixin方式不太一样,缺什么能力补什么能力,这是一种组合的方式,优于继承。,多继承一来,对于编译器的复杂性就来了

JS是基于面向对象的,类和对象都是对象模版。
混合mixin,指的是将一个对象的全部或者部分拷贝到另一个对象上去。其实就是属性了。
可以将多个类或对象混合成一个类或对象

在这里插入图片描述
现在这两个类是继承好的
在这里插入图片描述
要求这两个都提供序列化serialization的功能,试试用传统的继承方式能否解决
在这里插入图片描述
在这里插入图片描述缺什么功能可以判断有没有什么函数,测试下如何判断这个函数在不在一个class中

在这里插入图片描述
也可以这样,在this里试着调用,判断这个类型是否是function,是就打印ok,错误就抛出错误
在这里插入图片描述
现在进行构造一下,现在this.show1是undefined,所以要raise一个异常出来
在这里插入图片描述
像json一般提供字符的序列化方法stringify,如果没有这个函数,就抛出异常告诉你需要定义

定义一个序列化方法,这种方法更像是一种强制性的约束,现在从这里继承,就开始做检查,没有这个方法就开始抛出异常
在这里插入图片描述
注释掉,先不管这些,看看上面能否使用
在这里插入图片描述在这里插入图片描述
一执行就抛出异常,在派生类里必须要调用super构造器,在return之前
在这里插入图片描述
一般习惯,进入构造器就,如果有继承关系,在第一行就写super
在这里插入图片描述
this替换成实例,所以需要改下面的point,改成stringify
在这里插入图片描述在这里插入图片描述
这一回就可以了
在这里插入图片描述
说明是可以执行的
在这里插入图片描述
这里point3d调用super就到point上去了
在这里插入图片描述
point调用super,到了调用serialization里了
在这里插入图片描述
父类有这个=方法就算你有
在这里插入图片描述
可以调用
在这里插入图片描述
可以把父类的进行覆盖
在这里插入图片描述
这样的方案是一种继承的方案,强制要求具备这种能力,可以在做检查的是补能力,缺什么补什么
在这里插入图片描述在这里插入图片描述
如果使用extends扩展的,继承,不用super会出问题

在这里插入图片描述

现在做几次变形能够明白后面的mixin类

这样匿名类也是可以使用的
在这里插入图片描述
可以这么使用
在这里插入图片描述
更加复杂的,有个叫object,从这里继承
在这里插入图片描述
只要有extends,就必须强行调用super
在这里插入图片描述
A和B都没有x属性,但是不影响使用
在这里插入图片描述
换成A1依然可以
在这里插入图片描述
开始进一步变形,一旦继承,就需要在写构造器的时候写super,没有构造器就可以省略
在这里插入图片描述
这一步可以演化
在这里插入图片描述
下面开始进行构造,这里其实就是一个匿名函数,也就是D其实是一个函数,是一个普通的函数,这个函数调用一次传入的参数是一个类,这个类是作为别人继承要用的东西,传入的参数是一个类,这个类是作为别人继承要用的东西。继承的父类,把参数传进去后
在这里插入图片描述
这里相当于隐藏了一个return,是把一个类定义return回来了
在这里插入图片描述
有个类就可以new,这里的基类都什么都没写,构造器都是空的
在这里插入图片描述
什么都不写相当于用了D内部这个箭头函数所生成的新的类,这个新的类构建了一个实例出来
在这里插入图片描述
调用父类的100就可以使用了
在这里插入图片描述
这一块是一个整体,不能分开,D后面定义的就是一个函数,相当于python的lambda表达式
在这里插入图片描述
这里是return class,把class传回来了,必须是把函数调用一把可以
在这里插入图片描述
调用这个箭头函数,return的是class,类对象
在这里插入图片描述
这个类拿到以后就可以构造,没有定义构造器就可以先调用缺省构造器,缺省构造器会先调用父类的,父类就是A1
在这里插入图片描述
A1的构造器,就赋值成100
在这里插入图片描述
把无关代码拿掉

一个函数D,把里面的参数传给类,因为返回值是类
在这里插入图片描述
参数要么是函数,return值要么是函数,满足其一就是高阶函数,现在在这个基础上,又需要分一下,把原来的继承方式,改成把类混进去
在这里插入图片描述
目标是变成这样子
在这里插入图片描述
这个serialization函数,传了一个参数point,这个point让一个匿名类继承自它,然后这个类,作为一个返回值return。
也就是对这个函数的返回值是一个class,谁继承谁知道
在这里插入图片描述
放在extends关键字后面,必须是一个class,函数调用返回的是class
在这里插入图片描述
这个参数可以传进去

在这里插入图片描述
函数调用,就需要执行这个函数体,return了一个class,这个class很特殊,继承自传进去的Sup父类
在这里插入图片描述
这个父类就是point
在这里插入图片描述
相当于point继承一个子类出来在这里插入图片描述
以前的方法相当于,point继承sup,point3d,继承point
在这里插入图片描述
现在是,point3d又一个匿名类,匿名类继承自point,只影响了p3d这个类,point没有增加能力,整个路线被改变掉了
在这里插入图片描述
代码还需要修改
在这里插入图片描述
中间类是它的子类,不影响它
在这里插入图片描述
现在运行试试
在这里插入图片描述
这里没有super
在这里插入图片描述
返回的匿名类中间要加super
在这里插入图片描述
现在运行一下就没有问题
在这里插入图片描述
如果不知道传几个参数,可以用可变参数
在这里插入图片描述
但是这些参数从哪里来,需要在构造器的时候定义,这里需要参数结构之后把参数传给point
在这里插入图片描述
再次执行,4,5,6就可以了
在这里插入图片描述
这种方式是react经常使用的在这里插入图片描述
这个是整个推到过程
在这里插入图片描述
等号右边是一个函数对象
在这里插入图片描述在这里插入图片描述在这里插入图片描述
function和class方式需要练习,ES6的语法必须会
在这里插入图片描述在这里插入图片描述
可以使用箭头函数
在这里插入图片描述
想要把这些写成一行,一定要先把C(object)括号括起来,因为优先级太高,会出错
在这里插入图片描述
下面改序列号
在这里插入图片描述
在这里插入图片描述
改序列化就是增加这个就把原来的定义类变成定义函数,由一个函数变成高阶类,有这个函数送类进去,出类出来,然后得到一个高阶类,高阶类才是我们要用的东西,就把一个类包装起来了,子类一继承,被迫利用,相当于对父类做扩展,扩展出一个中间子类,中间子类又被别人继承了,中间子类就 变成别人的父类,被迫按照父类的要求有这样的东西。
总的来看
ponit3d继承自point,只不过在中间加了一个中间层

在这里插入图片描述
react框架大量使用了这种mixin技术
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值