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. java时间段分成小段存储

    package testThread; import java.text.ParseException; import java.text.SimpleDateFormat; import java. ...

  2. UIStackView使用 (堆视图)

    一基本使用 1创建多个子控件 for (int i = 0; i < 3; i++) { UIButton *imgBtn = [UIButton buttonWithType:UIButton ...

  3. RedHat下Bugzilla的安装和配置

    Bugzilla 是一个开源的缺陷跟踪系统(Bug-Tracking System). OS:RedHat Linux 软件类型:开源 架构:B/S server端模块开发语言:perl(c/c++) ...

  4. webStorage和cookie的区别

    共同点:         都是保存在浏览器端,且同源的   cookie有什么缺点? Cookie数量和长度的限制.每个domain最多只能有20条cookie,每个cookie长度不能超过4KB 安 ...

  5. FTP多任务下载实现类

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  6. 前端常用的几个js判断(二)

    10.鼠标悬停(hover)切换 class 属性假如当用户鼠标悬停在一个可点击的元素上时,你希望改变其效果,下面这段代码可以在其悬停在元素上时添加 class 属性,当用户鼠标离开时,则自动取消该 ...

  7. MVC5+EF6 入门完整教程八

    本篇是相对独立的一篇,主要讲解不丢失数据进行数据库结构升级. 前面我们讲解EF功能时,已经介绍过一种更新数据库的方式: EF比较model和database,如果两边不一致,程序将会drop and ...

  8. PHP发送电子邮件

    1.导入文件,如本案例把Stmp.class.php放到Common\Common目录下,代码很多,直接复制就行! <?php namespace Common\Common; class Sm ...

  9. 尺寸不固定的图片在div中垂直居中并完全显示

    前几天做一个项目,需要批量上传图片,图片外侧div尺寸固定:由于图片是用户输入的,所以大小存在不确定性,产品需求是无论图片尺寸多大,都要垂直居中完全显示 废话不多说,直接上代码 html <ul ...

  10. ORACLE 连接SQLSERVER 数据库备忘

    最近工作需要,要从SQL SERVER数据库中同步提取数据. 这里采用了  Oracle Gateway 来连接,折腾了半天,终于搞定,记录下已备下次使用. 基本资料网上都可以搜很多,官网配置说明在这 ...