Mixins many classes【混合许多个类】

迄今为止,我们已经学会了简单的继承,我们还能够通过使用mixins处理机制来混合许多类。源于这种理念是非常简单的;我们能够把许多个类最终混合到一个类去,最后的结果就是,新产生的类(在内部)能够通过mixings类来访问到那这些类中的方法和属性。

举个例子:我要做一个应用程序,是花样滑冰运动员和冰上舞蹈运动员的参加竞赛程序,一项竞赛程序就是一系列跳跃、旋转、滑步等动作的组合,裁判员根据每个运动员参加竞赛做的动作元素技术和移动水平来打分。

单纯的冰上花样滑冰需要去跳跃、旋转和做一些滑步动作,但对于冰上舞蹈来说它不允许有跳跃动作,只有旋转和滑步动作。

我们将把跳跃、旋转、滑步做成三个大类,其中每个类中都有我们需要的动作元素,这样滑冰运动员在竞赛程序中都拥有了自己要做的动作元素。

首先,我们需要建立以一个跳跃类,内含不同类型的跳跃动作。如果以后觉得还有新类型的跳跃动作没有定义的话,那我们很方便的在这个类中加入一个新的方法就可以。

(注:跳跃类为MyApp.skating.Jump,定义了waltz华尔兹式跳跃、axel前外一周半跳跃、split空中劈叉跳跃三种。因此我们定义了第1个类,如下:)

 //定义第1个类:跳跃类
Ext.define('MyApp.skating.Jump', {
waltz: function(){
console.log("waltz:华尔兹式跳跃,一周半旋转式跳跃,为前外一周半跳的最基本动作");
},
axel: function(){
console.log("axel:1.5式跳跃,在花样滑冰中实际上就前外旋转一周半式跳跃");
},
split: function(){
console.log("split:空中劈叉式跳跃,或是一个跳跃、后外钩点冰一周跳,或以环形起跳冰在空中来个大劈叉或者一个大跨越式动作");
},
//测试相同函数
combination : function(){
console.log("这是Jump类的combination方法!");
}
});

为了简单起见,在程序中我们仅仅向firefox的控制台发送一个log信息,以便于说清楚问题就行了。

现在,再建立第二个类Spin旋转,包含一个滑冰运动员所能做到得不同类型的旋转动作。

 //定义第2个类:旋转类
Ext.define('MyApp.skating.Spin', {
scratch: function(){
console.log("scratch:擦式旋转,自由腿交叉在滑冰腿的前面进行旋转动作");
},
crossfoot: function(){
console.log("crossfoot:交叉腿旋转,自由腿和滑冰腿前后交叉旋转动作,就像轮滑一样");
},
camel: function(){
console.log("camel:驼转,自由腿的膝盖要高于臀部的旋转动作");
},
//测试相同函数
combination : function(){
console.log("这是Spin旋转类的combination方法!");
}
});

我们最后一个类是滑步动作类FootWork,它能偶代表参赛选手在冰上所做到得滑步动作。

 //定义第3个类:滑步类
Ext.define('MyApp.stepssequence.Footwork', {
mohawk: function(){
console.log("mohawk:莫霍步式滑步,通常是在一个圆线或曲线上呈逆时针方向做完滑步,其实就是怎么转弯的问题。");
},
spreadeagle: function(){
console.log("spreadeagle:用双脚着地向鹰隼一样伸展滑步。");
},
twizzles: function(){
console.log("twizzles:多姿乐。在花样滑冰中采用一只脚变旋光作用下滑步。");
}
});

目前,在三个类中我们已经有了滑冰运动员要做的动作了,下一步还需要为每一个滑冰员添加上相应的动作,那么就应该在程序中添加上,就以花样滑冰运动员开始吧,它具有跳跃、旋转、滑步三类所有情况。

//二、定义花样滑冰运动员,内含三类情况。

 //二、定义花样滑冰运动员,内含三类情况。
Ext.define('MyApp.figure.Skater', {
extend : 'Ext.util.Observable', //第1步
mixins : { //第2步
jump : 'MyApp.skating.Jump',
spin : 'MyApp.skating.Spin',
footwork : 'MyApp.stepssequence.Footwork'
}, constructor : function(options){
Ext.apply(this,options); //第3步
}, compete : function(){
var me = this;
console.log(me.name+" 来自 "+me.nationality+" 的花样滑冰运动员开始节目! 祝好运!");
me.waltz();
me.mohawk();
me.camel();
me.axel();
me.spreadeagle();
me.scratch();
console.log(me.name+" 结束节目并获得了第一名!");
} });

·第1步:我们继承了Observable类,这个类允许我们去模板events 和listeners,在以后的章节中会介绍,现在使用它作为1个例子了解就行。

·第2步:继使用了mixins关键字来支持这个类,有了mixins我们这个'MyApp.figure.Skater',才能够去访问参与了mixins中所有的跳跃、旋转、滑步类的方法和属性。这是我们的学习点。

· 第3步:使用了构造造函数,这里接受了一个参数options一也是1个在运行时产生的对象,这将允许我们去简单的配置1个花样滑冰运动员的实例。

· 第4步: 我们创建了compete()方法,它建立了滑冰员参加竞赛的动作,注意的是,它实际上是让你学习如何调用参与了mixins类中的方法,我们能够任意调用Jump类、Spin类、FootWork类中的所有方法了!并且当创建1个实例对象的时候,还允许同时创建带有有参数name和nationality,参数丰富了这个花样滑冰运动员实例。

 // 开始:建立1个花样滑冰运动员的对象,并带有name和nationality参数,调用compete()。
var shenxue = Ext.create('MyApp.figure.Skater',{
name : '申雪',
nationality : '中国'
});
shenxue.compete();
shenxue.combination();
shenxue.mixins.spin.combination();

运行结果图:

现在,我们需要去创建一个冰上舞蹈运动员,他们不允许有跳跃Jump类,但允许有更多的旋转和滑步动作,如下:

 //三、定义冰上舞蹈运动员,不允许跳跃类,含有Spin类和footWork类。
Ext.define('MyApp.dancing.Skater',{
extend : 'Ext.util.Observable',
mixins : { //第1步
spin : 'MyApp.skating.Spin',
footwork : 'MyApp.stepssequence.Footwork'
}, constructor : function(options){ //第2步
Ext.apply(this,options)
}, compete : function(){
var me = this;
console.log(me.name+" 来自 "+me.nationality+"冰上舞蹈运动员开始节目! 祝好运!");
me.camel();
me.scratch();
me.spreadeagle();
me.twizzles();
me.camel(); console.log(me.name+" 结束节目并获得优秀的成绩!");
}
});

·第1步:为冰上舞蹈者混合Spin旋转类和FootWork滑步类,但是我们还可以混合更多的类。

· 第2步:使用了构造函数,如果你仔细的话,会发现这与花样滑冰者的构造函数一模一样。

· 第3步:我们创建了compete()方法,内仅仅包含对spin类和FootWork类的调用。

  //开始:建立1个冰上舞蹈运动员,并带有name和nationality参数,调用compete().
var susan = Ext.create('MyApp.dancing.Skater',{
name : '苏珊',
nationality : '美国'
});
susan.compete();

运行结果图:

  

《程序结束》

结论:关于mixins最重要的事情是:我们可以创建多个独立的类,每一个类都具有完成指定的任务,然后把这些类mixins到一个混合后的类,这样就可以用混合后的类来重复的调用任务。(例如me.camel();)

JS 4 新特性:混合属性(mixins)之二的更多相关文章

  1. JS 4 新特性:混合属性(mixins)

    Ext JS4的新特征1:混合属性(mixins) 组合是Extjs4的新特性,可用于实现多继承的情况.该属性会以同步方式加载类文件,并实例化该类(译者推理其内部使用Ext.create方法).直接上 ...

  2. Ext JS 6 新特性和工具

    Ext JS 6 新特性和工具 Ext JS 6 带来很多新特性.工具和改进.以下是一些亮点: • 合并了 Ext JS & Sencha Touch - 在 Ext 6, 你可以访问 Ext ...

  3. Ext JS 4 新特性2:配置项属性(config)之二

    Ext JS 4 新特征2:配置项属性config之二 ☞ Config(自动的setters和getters) Ext JS 4介绍了config声明方式,在Ext JS 中也有几个例子:在运行程序 ...

  4. Ext JS 4 新特性2:配置项属性(config)之一

    Ext JS 4 新特征2:配置项属性config 最新版本的Ext JS 4.2的另外一个伟大的新特征就是增加了configuration配置项属性,当我们在创建一个新类的时候,经常性的要设置某某属 ...

  5. html5新特性contenteditable 属性更容易实现动态表单

    介绍html5新特性的一个属性:contenteditable 作用域全局.所有的块标签都可以,例如:span.p.div.td等标签.但是,不可以作用域<br/>类型的标签. conte ...

  6. css3的新特性选择器-------属性选择器

    自己学css的时候比较乱,这次趁着复习把css3的新特性选择器和css2以前不怎么用的选择器做一个总结 <div id="parent"> <p>I'm a ...

  7. Java8新特性 Stream流式思想(二)

    如何获取Stream流刚开始写博客,有一些不到位的地方,还请各位论坛大佬见谅,谢谢! package cn.com.zq.demo01.Stream.test01.Stream; import org ...

  8. C# 9.0新特性详解系列之二:扩展方法GetEnumerator支持foreach循环

    1.介绍 我们知道,我们要使一个类型支持foreach循环,就需要这个类型满足下面条件之一: 该类型实例如果实现了下列接口中的其中之一: System.Collections.IEnumerable ...

  9. C#语言的新特性及相关信息

     .ENT版本 NET 2.0 :CLR, WinForms ,Wed Services,ASP.NET NET 3.0 :WCF,WF,WPF,CardSpace NET 3.5 :LINQ ,AJ ...

随机推荐

  1. return 关键字的作用

    注意: 如果一个函数的返回值类型是具体的数据类型,那么该函数就必须要保证在任意情况下都保证有返回值.(除了返回值类型是void以外) return 关键字的作用: 1. 返回数据给函数的调用者. 2. ...

  2. freemarker数字格式化

    1.在模板中直接加.toString()转化数字为字符串,如:${languageList.id.toString()}: 2.在freemarker配置文件freemarker.properties ...

  3. matlab 视频转换到图像并保存

    图像处理中像Adas.车辆检测等都需要采用视频文件比较好处理一点,利用帧差法.背景减法.光流法等,那么将视频文件转换到图像文件怎么做呢?话不多说,见代码一目了然: %================= ...

  4. Java之工厂方法

    普通工厂模式: 第一步:定义接口,坚持面向接口编程, package dp; public interface Sender {    public void send();} 第二步:实现接口: p ...

  5. python3 实现简单信用卡管理程序

    1.程序执行代码: #Author by Andy #_*_ coding:utf-8 _*_ import os,sys,time Base_dir=os.path.dirname(os.path. ...

  6. MySQL TCL 整理

    TCL(Transaction Control Language)事务控制语言SAVEPOINT 设置保存点ROLLBACK  回滚SET TRANSACTION

  7. AxureRP8实战手册(基础31-40)

    AxureRP8实战手册(基础31-40) 本文目录 基础31.     切换元件库 第2章          页面设置 基础32.     设置页面居中 基础33.     设置页面背景(图片/颜色 ...

  8. 20145224&20145238 《信息安全系统设计基础》 第四次实验

    20145224&20145238 <信息安全系统设计基础>第四次实验 课程:信息安全系统设计基础 班级:1452 姓名:陈颢文 荆玉茗 学号:20145224 20145238 ...

  9. JAVA GUI布局管理器

    边界布局管理器: a.布局方式:是把整个容器划分为五个部分.东西南北中,南北要贯通,中间最大 (不仅是中间的范围最大,权利也最大)当周边不存在的时候中间会占领周边,当中间不存在的时候周边不能占据中间 ...

  10. MT5:放大市场价格指标

    指标把当前交易品种价格简单的放大显示在图表上.   //+------------------------------------------------------------------+//|  ...