给类型增加方法
在js开发过程中,有时候我们需要一些特定的方法,但是语言本身并没有提供.比如,去掉字符串两头的空格,给一个数字取整(这个有parseInt()和Math对象的方法).这时候我们怎样做才能让开发变得简单一些呢?
举个例子:给字符串去掉首位的空格.也就是让所有的字符串的原型拥有一个去除首位空格的方法:
String.prototype.trim=function(){
return this.replace(/^\s+|\s+$/g,'');
}
这样我们在String的原型上添加了一个trim方法,所有的字符串对象立刻i就可以调用此方法,完成去除首尾空格的任务.
var str=' '+'abc'+' ';
console.log(str.length);//11
str=str.trim();
console.log(str.length);//1
再举个例子,我们想给所有的数字类型增加一个取整的方法(忽略小数点后的数字),怎么办?也很简单
Number.prototype.getInt=function(){
return this>0?Math.floor(this):Math.ceil(this);
}
var a=10.55,b=-12.33;
console.log(a.getInt());//10
console.log(b.getInt());//-12
但是仔细想一下,这样会不会有问题?
如果原型中已经有这个方法,那么我们添加的方法要么会覆盖原方法,要么覆盖失败,没有任何效果.大家可以自己测试一下.
所以我们在给构造函数的原型添加方法的时候要先对原型进行检测,如果原型中没有该方法,才进行添加操作.
function addMethod(Constructor,name,fn){
//如果原型没有name方法,那么给原型添加name方法
if(!Constructor.prototype[name]){
Constructor.prototype[name]=fn;
}
}
//尝试给数组原型添加slice方法,调用后输出字符串
addMethod(Array,'slice',function(){
console.log('custom slice method');
});
//尝试给数组添加count方法,调用后输出数组长度方法
addMethod(Array,'count',function(){
return this.length;
});
var arr=[2,3,4,5];
console.log(arr.slice()); //Array[4] [2,3,4,5] 原来的slice方法并没有改变
console.log(arr.slice(2);//Array[2] [4,5] 原来的slice方法并没有改变
console.log(arr.count()); //4 //新添加的count方法生效了.
总结:给构造函数的原型添加方法,可以强化对js对象的操作能力.但是一定要注意,原型中是否已存在同名的方法.只有在不存在同名方法的情况下,才可以酌情添加.
还有一种比较高端的方法:
Function.prototype.method=function(name,func){
if(!this.prototype[name]){
this.prototype[name]=func;
}
}
String.method('trim',function(){
return this.replace(/^\s+|\s+$/g,'');
});
var str=' '+'abc'+' ';
console.log(str.length); //13
str=str.trim();
console.log(str.length);//3
详见javascript语言精粹--给类型增加方法