代码改变世界

每天一点点-EXT源码分析之五

2012-01-19 00:47    阅读(129)  评论(0)    收藏  举报
看看EXT对Array的扩展。
首先,Array是函数类型。
其次,直接往构造函数里添加的属性或方法,可以称之为静态,因为它是属于构造函数(类)的,也就是说,必须这样访问。
function P(){

}
P.fn=function(){
   alert("静态方法");
}
P.fn();//不可用实例调用

而往构造函数prototype里添加的是实例属性,它属于实例,必须这样访问
function P(){
  
}
P.prototype.fn=function(){
   alert("实例方法");
}
var a=new P();
a.fn();


然后,Ext.applyIf()的作用是第一个参数(对象)拷贝所有在第二个参数里(对象)有而自身没有的属性,

Ext.applyIf(Array.prototype, {
    indexOf : function(o){
        for (var i = 0, len = this.length; i < len; i++){
            if(this[i] == o){
                return i;//根据参数值查找其所在的索引位置.
            }
        }
        return -1;//无,返回-1
    },

    remove : function(o){
        var index = this.indexOf(o);
        if(index != -1){
            this.splice(index, 1);
        }
        return this;
    }
});



注:在原生的js1.6里indexOf已经写入规范,但各个游览器是否实现并不确定。
所以EXT用的是Ext.applyIf(),为没实现indexOf的游览器在Array.prototype里添加indexOf,并且也添加了一个remove,以便Array的所有实例可以使用,增强了原生的Array的功能。

这俩个函数还是非常简单的,所以其实功能非常有限,只能返回索引值和删除元素
但往往问题总不会那么容易解决,比如如果在对数组元素进行添加,删除等操作时,应该会给用户一个提示框,用以确认,很容易想到,可以
Ext.extend(Array,Ext.util.Observable,{})
来是给以想Array增加添加事件的能力,并且在Ext.extend的第三个参数里添加予以触发特定事件机会的函数。
注意:第三个参数对象里的属性和方法是添加到超类的prototype中的,必须用子类的实例访问

非常幸运
EXT已经提供了一个非常强大的Ext.util.MixedCollection集合类
明白它的实现,明天任务。