给类型增加方法

 

在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语言精粹--给类型增加方法

原文地址:https://www.cnblogs.com/zhangfengyang/p/5059018.html