一、向内置类原型上扩展方法

  • 原型对象上编写的属性和方法是为当前类供其实例调用的公共属性和方法,为后期实例基于proto去查找调用

    1.向内置类原型扩展方法的优点:

  • 使用方便, 之前是“quick(arr)” 现在是“arr.quick()”

  • 能保证quick中的this就是要操作的数组【格式肯定是数组】
  • 趋近于内置方法的处理
  • 而且是扩展到了内置类的原型上,以后任何的上下文中,基本都可以直接调用,无需再把quick导入进来
  • ….

    2.向内置类原型扩展方法的缺点:

  • 我们设置的方法名,不要和内置方法名一样【一般设置名字的时候,我们自己加一个前缀,例如:myXxx】,如果一样,则我们写的方法会覆盖内置方法

    3.基于快速排序方法向Array.prototype上扩展方法

    1. //快速排序
    2. const quick = function quick(arr) {
    3. if (arr.length <= 1) return arr;
    4. let middleIndex = Math.round(arr.length / 2),
    5. middleValue = arr.splice(middleIndex, 1)[0],
    6. arrLeft = [],
    7. arrRight = [];
    8. for (let i = 0; i < arr.length; i++) {
    9. let item = arr[i];
    10. item > middleValue ? arrRight.push(item) : arrLeft.push(item);
    11. }
    12. return quick(arrLeft).concat(middleValue, quick(arrRight));
    13. };
    14. let arr = [12, 16, 8, 1, 24, 15];
    15. console.log(quick(arr));
    1. //向内置类原型扩展方法
    2. Array.prototype.quick = function quick(){
    3. // this -> arr 用this代替之前的传参【特殊:不能这样执行 Array.prototype.quick();他的this不是arr,而是Array.prototype】
    4. if (this.length <= 1) return this;
    5. let middleIndex = Math.round(this.length / 2),
    6. middleValue = this.splice(middleIndex, 1)[0],
    7. arrLeft = [],
    8. arrRight = [];
    9. for (let i = 0; i < this.length; i++) {
    10. let item = this[i];
    11. item > middleValue ? arrRight.push(item) : arrLeft.push(item);
    12. }
    13. return arrLeft.quick().concat(middleValue, arrRight.quick());
    14. }
    15. arr.quick();

    向内置类原型扩展方法,可以实现链式写法

    二、链式写法:执行一个方法,返回的结果可以继续调用其所属类原型上的其他方法…

  • 核心:需要把方法放到所属类的原型上

    1. arr.quick().reverse().map(item => item * 10).push('zhufeng');

    三、 私有和公用属性的检测

  • 思路:

    • 不论对象的私有属性中是否存在这个属性,只要它公有属性中有这个属性,【只要是实例所属类的原型上写的属性都是实例的公有属性,而且一直要到Object.prototype】,则结果就是true
  • 具体实现:
    • 首先获取当前实例this(obj)的原型对象@A,看@A中是否存在attr这个属性,
      • 存在则直接返回true,说明attr是它的一个公有属性;
      • 如果不存在,则找@A的原型对象…直到找到Object.prototype;
    • 如果整个过程中都没有找到对应的属性,则说明attr不是他的公有属性,返回false即可!!
    • Object.getPrototypeOf(实例):获取某个实例的原型对象
      1. //把检测其公有属性的方法拓展到对象类的原型上【基类的原型上Object.prototype】
      2. Object.prototype.hasPubProperty = function hasPubProperty(attr){
      3. let proto = Object.getPrototypeOf(this);
      4. while (proto) {
      5. if (proto.hasOwnProperty(attr)) return true;
      6. proto = Object.getPrototypeOf(proto);
      7. }
      8. return false;
      9. };