• 给类型增加方法


     

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

  • 相关阅读:
    将项目中某些常用设置做成配置项
    资产管理平台去除zabbix字样
    navicat远程连接报错
    Excel数据导入MySql数据库
    Ubuntu16.04使用命令行安装jdk1.8
    zabbix4.0配置短信报警
    整洁代码系列(2)
    找回篮球场上的快乐
    努力做人、努力学习、努力让身边的人过得更好 --2016年总结、2017年规划
    整洁代码系列(1)
  • 原文地址:https://www.cnblogs.com/zhangfengyang/p/5059018.html
Copyright © 2020-2023  润新知