js内置类的原型上扩展方法

939 阅读2分钟

内置类的原型上扩展方法:

    1. 内置类的原型上会默认存在很多常用的方法
  • Array.prototype / String.prototype / Object.prototype ... 这些方法实例都可以调用,但是内置的方法不一定能满足所有的开发需求,有很多方法需要自己来编写

    1. 向原型上扩展的方法,调用起来比较的方便
  •  实例.方法()
    
  •  方法执行的时候,方法中的THIS就是当前处理的实例
    
  • 1)扩展的方法名字最好设置前缀,例如:Myxxx,防止自己扩展的方法替换了内置的方法
     例:
      String.prototype.indexOf = function indexOf() {
       return 'OK';
      };
      console.log(url.indexOf('?'));
     此时就把原有的方法覆盖了
    
  • 2)THIS的结果一定是对象数据类型值,所以向基本数据类型的原型上扩展方法,方法被执行的时候,方法中的THIS不再是基本类型,但是还按照原始的方法处理即可(因为在运算的时候,会隐式调用对象的valueOf方法,返回它的原始值,而原始值就是之前的基本数据类型值)
     例:
      String.prototype.queryURLParams = function queryURLParams(key) {
         // this -> 当前要处理解析的URL
         let obj = {};
         this.replace(/([^?&=#]+)=([^?&=#]+)/g, (_, $1, $2) => obj[$1] = $2);
         this.replace(/#([^?&=#]+)/g, (_, $1) => obj['_HASH'] = $1);
         return typeof key === "undefined" ? obj : obj[key];
      };
      let url = "http://www.zhufengpeixun.cn/?lx=1&from=wx#video";
      let result = url.queryURLParams();
      console.log(result);
    
  • 3)如果返回的结果依然是当前类的实例,还可以继续调用当前类原型上其它的方法(如果不是自己类的实例,可以掉用其它类原型上的方法) => “链式写法”
     例:
     (function () {
         function handleNum(num) {
             num = Number(num);
             return isNaN(num) ? 0 : num;
         }
         Number.prototype.plus = function plus(num) {
             num = handleNum(num);
             return this + num;
         };
         Number.prototype.minus = function minus(num) {
             num = handleNum(num);
             return this - num;
         };
     })();
      
     let n = 10;
     let m = n.plus(10).minus(5);
     console.log(m); //=>15(10+10-5)
    
  • 3.对于一个对象来说,它的属性方法(私有的/公有的)存在“枚举”的特点:在FOR IN循环的时候是否可以遍历到,能遍历到的是可枚举的,不能遍历到的是不可枚举的【内置类原型上自己扩展的方法是可枚举的】 例: // obj.proto=Object.prototype; // AAA是可枚举的属性了 Object.prototype.AAA = function AAA() {}; let obj = { name: 'zhufeng', age: 11 }; for (let key in obj) { // 在遍历的时候,对于原型上扩展的公共属性方法,我们过滤掉,只遍历对象中私有的属性方法(必须是可枚举的) if (!obj.hasOwnProperty(key)) break; console.log(key); }