`
yiminghe
  • 浏览: 1453439 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Ext.extend 的一点改进

阅读更多

Extjs 中的模拟继承使用很多,比如 Component 是所有 extjs 组件的基类,机制就是 Ext.extend 函数 ,所有组件实例化前都要调用父类组件的实例化程序,如:


Container :

 

 // private
    initComponent : function(){
        Ext.Container.superclass.initComponent.call(this);
.....

     }

 

这个机制也可用于一般的情况,如:

 

function base(){
		
	}
	
	base.prototype.parentMethod=function(str){
		alert('父类执行:'+str);
	}
	
	var child=Ext.extend(base,{
		parentMethod:function(str){
			
			//很不方便
			child.superclass.parentMethod.apply(this,[str]);
			
			//这样不是很好么
			//this.supermethod(str);
		}
	});
	
	var c=new child();
	c.parentMethod('原来的ext.extend');

 


就像注释中所说的,在一个子类方法中要调用父类的方法,extjs的写法有点啰嗦 ,若是override的那么直接supermethod 不就可以了么。





部分借鉴了  base2 中所实现的 javascript 类模拟机制,改造了一下 Ext.extend 很容易就实现了上述简单的写法:

 

改进的 Ext.extend

 

(function(){
		
		//函数中是否包含调用父类对应函数的代码(opera 函数不能表示)
		var hasSuper= /supermethod/.test(function(){supermethod;}) ? /\bsupermethod\b/ : /.*/;  
	
		Ext.extend = function(){
            // inline overrides
            var io = function(o){
                for(var m in o){
                    this[m] = o[m];
                }
            };
            var oc = Object.prototype.constructor;

            return function(sb, sp, overrides){
                if(typeof sp == 'object'){
                    overrides = sp;
                    sp = sb;
                    sb = overrides.constructor != oc ? overrides.constructor : function(){sp.apply(this, arguments);};
                }
                var F = function(){}, sbp, spp = sp.prototype;
                F.prototype = spp;
                
                 //不直接设置 sb.prototype = new F();
                //sbp = sb.prototype = new F();
                sbp = new F();
                                
                // 手动设置
					      for (var name in overrides) {
					     	
					     	 if(!overrides.hasOwnProperty(name)) return;
					     	
					       // 父类有这个函数
					       sbp[name] = 
					       typeof overrides[name] == "function"
					       && typeof sbp[name] == "function"
					       
					       //并且 override的函数调用了父类函数
					       && hasSuper.test(overrides[name]) ?
					       
					         (function(name, fn){
					           return function() {
					           	 	
					             var tmp = this.supermethod;
					            
					             //调用时把父类的函数存在自己的context中,供子类函数调用
					             this.supermethod = spp[name];
					            
					             
					             var ret = fn.apply(this, arguments); 
					             
					             //恢复原状,只保证调用时可以就行了
					             this.supermethod = tmp;
					            
					             return ret;
					           };
					         })(name, overrides[name]) :
					         overrides[name];
					      }
                
                sb.prototype=sbp;
                
                sbp.constructor=sb;
                sb.superclass=spp;
                if(spp.constructor == oc){
                    spp.constructor=sp;
                }
                
                
                sb.override = function(o){
                    Ext.override(sb, o);
                };
                sbp.override = io;
                
                //不需要了,前面手动做了
                //Ext.override(sb, overrides);
                
                sb.extend = function(o){Ext.extend(sb, o);};
                return sb;
            };
        }();
	
	})();
 

当然这样的话,用了闭包保存了原来的函数,内存以及效率上应该不如以前了,但是对于override的函数可以很直接的使用:

 

改进后的使用

 

child=Ext.extend(base,{
		parentMethod:function(str){	
					
			this.supermethod(str);
			alert("call child");
		},
		//原来用法保留
		otherMethod:function(){
			child.superclass.parentMethod.apply(this,['test2']);
		}
	});
	
	grand=Ext.extend(child,{
		parentMethod:function(str){			
			this.supermethod(str);
			alert("call grand");
		}
	});
	
	
	var c=new grand();
	
	c.parentMethod('改进的ext.extend');
	c.otherMethod();
 

 

 

分享到:
评论

相关推荐

    Ext.Store的获取方法

    Leangle.form.combo.ColorComboBox = Ext.extend(Leangle.form.BaseComboBox, { // ComboBox configurations store: new Ext.data.JsonStore({ // store configurations }) }); ``` 在这种情况下,尝试使用`Ext...

    jquery.validate.extend.js

    jquery.validate.extend.js

    原生js实现jquery $.extend方法

    原生js实现jquery $.extend方法 通过遍历对象属性来实现

    jquery $.fn.extend

    `$.fn.extend`是jQuery库中的一个核心方法,主要用于扩展jQuery对象的方法集合。这个方法允许开发者自定义jQuery的函数,从而实现对DOM元素的操作或添加新的功能。在jQuery中,`$.fn`实际上是`$.prototype`的一个...

    underscore.extend与$.extend实例比较分析

    在JavaScript开发中,`underscore` 和 `jQuery` 都提供了扩展对象的功能,即 `_.extend()` 和 `$.extend()` 方法。这两个方法允许开发者合并一个或多个对象的属性到目标对象中,实现对象间的属性拷贝。本文将深入...

    Ext.data.Store 读取XML属性值

    extend: 'Ext.data.Model', fields: ['id', 'name', 'email'] }); var store = Ext.create('Ext.data.Store', { model: 'MyModel', proxy: { type: 'ajax', reader: { type: 'xml', record: 'item' // XML...

    Jquery实现$.fn.extend和$.extend函数_.docx

    在JavaScript中,jQuery库提供了两种扩展对象的方法,即`$.fn.extend`和`$.extend`。它们都用于增加或修改现有对象的功能,但应用场景不同。本文将深入解析这两种方法的实现原理和用途。 首先,`$.fn.extend`是用于...

    jQuery.extend和jQuery.fn.extend的区别

    在jQuery的API中,`jQuery.extend`和`jQuery.fn.extend`是两个重要的方法,它们用于合并对象属性,但作用范围和用途有所不同。本文将深入探讨这两个方法的差异,并通过实例解析它们的工作原理。 首先,`jQuery....

    Ext.ux.UploadDialog

    Most configuration options are inherited from Ext.Window (see ExtJs docs). The added ones are: url - the url where to post uploaded files. base_params - additional post params (default to {}). ...

    ext多选下拉列表的全选功能实现

    "ext多选下拉列表的全选功能实现"这个主题聚焦于一个特定的UI组件——ExtJS库中的MultiComboBox,这是一种允许用户多选的下拉列表控件。在实际应用中,全选功能常常被用来快速选择所有选项,极大地提高了用户的操作...

    Extjs 继承Ext.data.Store不起作用原因分析及解决

    关于这个原因有很多种,我只说下我遇到的 我这样 写Store来复用的 代码如下: DocStore = Ext.extend(Ext.data.Store,{ initComponent:function(){ this.proxy = new Ext.data.HttpProxy({url:this.url}); this....

    Ext.js核心函数详解.docx

    4. `Ext.extend( Object subclass, Object superclass, [Object overrides] )`: 这是实现面向对象编程的关键函数,它用于创建子类,将`subclass`扩展自`superclass`。`overrides`参数用于提供子类覆盖父类的方法或...

    Ext一些方法的重写

    在`ext-extend.js`这个文件中,可能包含了对`Ext.extend()`的进一步实现和扩展,或者展示了如何在实际项目中重写`Ext`库的方法。通常,这样的代码示例会包含具体的类定义、方法重写以及如何在应用中使用这些自定义类...

    Ext.js核心函数详解.pdf

    6. `Ext.extend(Object subclass, Object superclass, [Object overrides])`: 这是实现JavaScript继承的关键函数。`subclass`是子类,`superclass`是父类,`overrides`是子类要覆盖或扩展父类的方法。它创建了一个新...

    ExtJs 带清空功能的日期组件

    可以通过`Ext.extend()`方法实现这一点。 ```javascript Ext.define('MyApp.form.field.ClearableDate', { extend: 'Ext.form.field.Date', alias: 'widget.clearabledatefield', // 添加其他配置项... }); ``...

    jQuery.extend

    **jQuery.extend** jQuery.extend是jQuery库中的一个非常重要的方法,用于合并两个或更多对象的属性到第一个对象上。这个功能在开发过程中非常实用,尤其是在处理配置选项、扩展插件或者对象继承时。让我们深入探讨...

    Jquery实现$.fn.extend和$.extend函数

    在jQuery库中,`$.fn.extend` 和 `$.extend` 是两个非常重要的功能,它们用于扩展jQuery的功能和对象。这两个函数虽然名字相似,但作用却截然不同。 首先,`$.fn.extend` 是用于扩展jQuery选择器对象的方法。当你...

Global site tag (gtag.js) - Google Analytics