在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+"\n";
} );
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 );
注意: 内置类的方法可以重写,但属性是不能重写的。
特别提醒: 使用扩展内置类的原型会对内置类造成污染,因为内置类的原型是一种全局作用的。 在多人合作的大中型项目中有可能对别人的代码造成影响。
那么这时,可以采用自定义类,将内置类的实例作为参数传给构造函数,在自定义的类中定义扩展方法。