Kendo UI - Class 基类定义
2015-10-29 15:19
465 查看
在 kendo 中,使用原型继承机制,Class 是 Kendo 中的基类,定义了函数 extend 用来派生其它类。
首先,我们可以看到
也就是说,Class 是一个函数,在 Kendo 中,所有的类都是通过函数定义,创建对象使用 new 方式来创建。
这里的 extend 是 Class 的静态成员,在 Kendo 中,派生子类都是通过父类的 extend 方式进行处理。方法的参数是子类所扩展的成员对象。
在这个函数内部,首先定义了一个基类函数 base,这显得很奇怪,但是,很快可以发现,这个函数的原型与 Base 的原型其实是同一个,所以通过它们创建出来的对象,行为模式其实是相同的。
而子类则为 init 函数所定义,在 new 子类对象实例的时候,实际上调用的就是定义子类时提供的 init 函数,在子类的 init 函数内部又调用了父类的构造函数,实现继承机制。
通过将子类的原型设置为父类的对象实例,实现原型继承机制。
子类总是会扩展父类的成员,下面的代码实现为子类的原型对象扩展各种成员。
constructor属性始终指向创建当前对象的构造函数。这里将原型对象的构建函数也设置为子类函数。保证检查类型的时候可以正确工作,可以参看这里的说明:JavaScript:constructor属性
使子类也拥有一个同样的 extend 函数,便于继续派生子类。
最后返回子类函数。
function Class() {} Class.extend = function(proto) { var base = function() {}, member, that = this, subclass = proto && proto.init ? proto.init : function () { that.apply(this, arguments); }, fn; base.prototype = that.prototype; fn = subclass.fn = subclass.prototype = new base(); for (member in proto) { if (proto[member] != null && proto[member].constructor === Object) { // Merge object members fn[member] = extend(true, {}, base.prototype[member], proto[member]); } else { fn[member] = proto[member]; } } fn.constructor = subclass; subclass.extend = that.extend; return subclass; };
首先,我们可以看到
function Class() {}
也就是说,Class 是一个函数,在 Kendo 中,所有的类都是通过函数定义,创建对象使用 new 方式来创建。
Class.extend = function(proto) {
这里的 extend 是 Class 的静态成员,在 Kendo 中,派生子类都是通过父类的 extend 方式进行处理。方法的参数是子类所扩展的成员对象。
在这个函数内部,首先定义了一个基类函数 base,这显得很奇怪,但是,很快可以发现,这个函数的原型与 Base 的原型其实是同一个,所以通过它们创建出来的对象,行为模式其实是相同的。
var base = function() {}, subclass = proto && proto.init ? proto.init : function () { that.apply(this, arguments); }, base.prototype = that.prototype; fn = subclass.fn = subclass.prototype = new base();
而子类则为 init 函数所定义,在 new 子类对象实例的时候,实际上调用的就是定义子类时提供的 init 函数,在子类的 init 函数内部又调用了父类的构造函数,实现继承机制。
通过将子类的原型设置为父类的对象实例,实现原型继承机制。
子类总是会扩展父类的成员,下面的代码实现为子类的原型对象扩展各种成员。
for (member in proto) { if (proto[member] != null && proto[member].constructor === Object) { // Merge object members fn[member] = extend(true, {}, base.prototype[member], proto[member]); } else { fn[member] = proto[member]; } }
constructor属性始终指向创建当前对象的构造函数。这里将原型对象的构建函数也设置为子类函数。保证检查类型的时候可以正确工作,可以参看这里的说明:JavaScript:constructor属性
fn.constructor = subclass;
使子类也拥有一个同样的 extend 函数,便于继续派生子类。
subclass.extend = that.extend;
最后返回子类函数。
相关文章推荐
- iOS 如何解决UITableView刷新卡顿现象
- iOS_ UIScrollview_无限循环
- 日常问题记录--JSP页面中通过<s:property value="#parameters.userName[0]>获取URL参数中文时为乱码的解决办法
- warning: push.default is unset; its implicit value has changed in Git 2.0 from 'matching' to 'simple
- QueryRunner的使用
- 随机生成36位的UUID
- 【Mockplus教程】添加
- 【Mockplus教程】删除
- 【Mockplus教程】复制/粘贴/克隆
- easyui datebox 清空值或添加自定义按钮
- 使用Auto-Scaling服务在Bluemix平台构建可自动伸缩的应用
- 如何布局包含Image和Title的UIButton
- How to use For loop in CruiseControl.net
- 转载: buildroot编译环境
- Could not build module ‘libxmlSimu'
- uIP编译时配置选项
- iOS UICollectionViewController基本使用方法和简单的相册实现
- 使用ValueAnimator自定义动态XY图表View
- LeetCode N-Queens II
- 基于物理着色(三)- Disney和UE4的实现