javascript中扩展Array类的原型
在js中,只要是类就有原型,不管它是自定义类还是js的内置类,我们可以通过修改内置类的原型,让js基本类型的对象获得其它功能。
下面,我们来扩展一下Array类的原型.
//扩展Array类,实现一个each函数, //功能:循环数组中的每个元素。 // 参数: fun是一个回调函数,可以理解成是一个接口,调用each方法时,要提供这个接口的一个实现函数。 Array.prototype.each=function( fun ){ //无论是在类的构造函数还是在原型中,this都指向实例化的对象,这里指的是调用each方法的数组对象. for( var i=0,n=this.length;i<n;i++){ fun( i, this[i]); } } //Array类的克隆函数 Array.prototype.clone=function(){ var o=[]; this.each( function(k,v){ o[k]=v; }); return o; } //Array类的map函数 Array.prototype.map=function( fun ){ var o=[]; this.each( function( k,v){ o[k]=fun( k,v ); } ); return o; } //Array类的del函数:在ie中delete是保留字,所以用del做函数名 Array.prototype.del=function( a ){ var o=this.clone(); for( var i=o.length,n=0;i>n;i--){ if( o[i]==a ){ o.splice(i,1 ); } } return o; } //当然,也可以重写Array类原有的toString()方法, Array.prototype.toString=function(){ var str=""; this.each( function(k, v){ str+=k+":"+ v+","; } ); return str; } //测试each函数 var arr=[1,2,3,4]; var str=""; arr.each( function(k, v){ str+=k+":"+ v+" "; } ); alert( str ); //测试clone函数 var r=arr.clone(); alert( r ); //测试map函数 r=arr.map( function(k,v ){ return v*2; } ); alert( r ); //测试del函数 r=r.del( 4 ); alert( r );
注意: 内置类的方法可以重写,但属性是不能重写的。
特别提醒: 使用扩展内置类的原型会对内置类造成污染,因为内置类的原型是一种全局作用的。 在多人合作的大中型项目中有可能对别人的代码造成影响。
那么这时,可以采用自定义类,将内置类的实例作为参数传给构造函数,在自定义的类中定义扩展方法。
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。