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. asp.net 一句话搞定分页

    rows 是客户端传过来的行数,page是页码,传参就需要就两个参数就行,sql语句中_row 和_page 自己声明的局部变量,值还是相应的row 和page ,为了运算而已. 用数据库类获得它的D ...

  2. CSS3中的伪类选择器详解

      类选择器和伪类选择器区别 类选择器我们可以随意起名,而伪类选择器是CSS中已经定义好的选择器,不可以随意起名. 伪类选择器以及伪元素 我们把它放到这里 p.aaas{ text-align: le ...

  3. usb中的传输模式

    别人总结的一个usb传输模式,保存一下 usb中的endpoint(端点)和传输模式 端点: 端点位于USB 外设内部,所有通信数据的来源或目的都基于这些端点,是一个可寻址的FIFO. 每个USB 外 ...

  4. Oracle安装时OracleMTSRecoveryService找不到

    电脑重做系统之后再安装oracle过程中出现一个问题,说OracleMTSRecoveryService找不到指定的目录文件,卸载重装还是没有改变,挣了半天终于找到怎么更改了,打开注册表编辑器,SYS ...

  5. 多线程环境的UI控件属性更新

    Winform: public delegate void UpadataTextCallBack(string str,TextBox text); public void UpadtaText(s ...

  6. python——django的post请求

    两次被同一块石头绊倒简直不可原谅!第一次写django程序的时候,就因为ajax post请求折腾了整整一天,时隔两个多月昨天又被虐一整晚.叔可忍婶儿也不能忍了!!!重要的事情写下来,为以后轻松碾压p ...

  7. (转)px、em、rem的区别和使用

    国内的设计师大都喜欢用px,而国外的网站大都喜欢用em和rem(国外的大部分网站能够调整的原因在于其使用了em或rem作为字体单位),那么三者有什么区别,又各自有什么优劣呢? 一.px特点 1. IE ...

  8. request和session作用域的意义

    1.简单说 page指当前页面.在一个jsp页面里有效 ,page里的变量没法从index.jsp传递到test.jsp.只要页面跳转了,它们就不见了.2.request 指从http请求到服务器处理 ...

  9. EasyUI相关

    失去焦点事件 validType:'length[4,15]',events:{blur: function(){}} 添加自定义属性 $.extend($.fn.validatebox.defaul ...

  10. Android 判断字符串是否为空

    TextUtils.isEmpty(str) 可以判断字符串是否为null或者"",当是的时候为true,否的时候为false