高阶对象或高阶类,采用了一种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技术