美文网首页
前端的那些事(五):类(封装,继承,多态)

前端的那些事(五):类(封装,继承,多态)

作者: 沐雨芝录 | 来源:发表于2019-04-30 11:20 被阅读0次

    前言

    js主要的三大编程方式:过程化编程函数式编程面向对象编程,好的面向对象编程,也可以理解为好的类的设计模式,提高代码可维护性和健壮性。

    封装

    定义:

    当你需要隐藏一些属性和方法时,就可以将这些属性和方法封装起来,然后通过一个外部可以调用的特定接口(也可以说是一个公共的方法)进行调用。

    function Person(name, age, sex) {
      this.name = name; //共有变量
      var age = age; //私有变量
      var sex = sex; //私有变量
      this.show = function() {
        console.log(age + '岁,性别' + sex);
      };
    }
    var person = new Person('小米', 18, '女');
    console.log(person.name); // Sunshine
    console.log(person.age); // undefined
    person.show(); // 18====女
    

    可以看到,在构造函数中this是共用变量,外部可以访问,var是私有变量,外部不能访问,就达到了我们封装的需要了。


    继承

    定义:

    当多个方法存在相同的属性和方法时,就把这些相同的属性和方法提取到一个公共的方法中,通过原型prototype继承该方法,当然你也可以通过call或apply来继承该方法中的属性和方法。

    子类去继承父类的方法:

    function Parent(name, age, sex) {
      this.name = name;
      this.age = age;
    }
    
    Parent.prototype.show = function() {
      console.log(this.age + '岁,性别' + this.sex);
    };
    
    function Child(name, age, sex) {
      this.sex = sex;
      Parent.call(this, name, age);
    }
    
    Child.prototype = new Parent();
    
    var child = new Child('小米', 18, '女');
    child.show(); // 18岁,性别女
    

    可以看到我们这里用 Parent.call(this, name, age)继承了父类构造函数里面属性;Child.prototype = new Parent()去继承父类构造函数的方法;

    ps:有同学好奇了,为什么还要prototype去做继承,好晕啊。原因就是如果用call,每一次new就执行一遍父类里面的方法,造成内存浪费,性能下降。

    常见面试题:object.create的原理?

    function createObj(o) {
      function F(){}
      F.prototype = o;
      return new F();
    }
    

    js继承大全,请看我写的另一篇文章:js继承的方式:精选篇


    多态

    定义:

    同一个实现接口,使用不同的实例而执行不同的操作。
    做什么谁去做怎样做分开。

    出题:有一群动物,我对猫狗发出叫的命令,发出什么声音?

    非多态方式实现
    var makeSound = function(animal) {
      if (animal instanceof Cat) {
        console.log('喵');
      } else if (animal instanceof Dog) {
        console.log('汪');
      }
    };
    var Cat = function() {};
    var Dog = function() {};
    makeSound(new Cat());
    makeSound(new Dog());
    
    多态方式实现
    var makeSound = function(animal) {
      animal.sound();
    };
    
    var Cat = function() {};
    Cat.prototype.sound = function() {
      console.log('喵');
    };
    var Dog = function() {};
    Dog.prototype.sound = function() {
      console.log('汪');
    };
    
    makeSound(new Cat());
    makeSound(new Dog());
    

    我想很多同学很好奇,到底啥时候用它?

    不知大家有没有听过23种设计模式与6种设计规则。其中策略模式与状态模式就是多态的思想。

    我想告诉大家的是,如果一个前端只做前端,不学习node后端思想,那么就是青春饭,长远不了,想晋升,就需要有全栈的思想。话不多说,举个例子。

      我想每个人都打过游戏吧,比如有几种状态,减速,加速,眩晕,冰冻,中毒。
      当你被减速了,减速效果90%,减速时间2s,此时获得队友加速技能,加速50%,加速时间3s。用if else如何实现,想必大家有了答案,挺复杂的。
      当你受了几种状态叠加,各种情况,你得使用排列组合了,而且日后因为用户反馈,有些技能大强大,得优化,就各种改动,你将无法维护这个判断条件。
      此时状态模式就诞生了,他要把每一种状态都单独封装起来,通过一个委托函数去处理各种情况,这使得你的条理清晰,极大提高了可维护性和编码性。

    如何编写设计模式,这里就不在讨论范围,日后我会出一个专题就将设计模式。

    相关文章

      网友评论

          本文标题:前端的那些事(五):类(封装,继承,多态)

          本文链接:https://www.haomeiwen.com/subject/ipmunqtx.html