面向对象编程三大特性------封装、继承、多态

1,499 阅读2分钟

面向对象编程三大特性------封装、继承、多态

首先什么是面向对象?

  • 面向对象(Object Oriented)是软件开发方法。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。
  • 面向对象的方法主要是把事物给对象化,包括其属性和行为。面向对象编程更贴近实际生活的思想。总体来说面向对象的底层还是面向过程,面向过程抽象成类,然后封装,方便使用就是面向对象(万物皆对象)。
    面向对象主要有三大特性:封装、继承、多态

1.封装

对于封装而言,一个对象它所封装的是自己的属性和方法,所以它是不需要依赖其他对象就可以完成自己的操作,封装也有众多的好处,例如:降低耦合率 可重复调用类中的属性 提高安全性

2.继承(面向对象编程最重要的部分)

继承是子对象可以继承父对象的属性和行为,即父对象拥有的属性和行为,其子对象也就拥有了这些属性和行为。这非常类似大自然中的物种遗传。 文字替换图片

  • 2.1、借用构造函数继承 A.call(this);
    缺点:是只继承成员属性,不继承原型上的属性
  • 2.2、原型式继承 B.prototype=A.prototype;
    缺点:该方法只继承原型上的属性,不继承成员属性
  • 2.3、原型链继承 原型上实例化一个类 B.prototype=new A();
    缺点:继承的成员属性在原型上,可能无法检测到存在bug
  • 2.4、组合式继承(稳妥式继承)A.call(this);+ B.prototype=new A();
    缺点:父类执行两次
  • 2.5、寄生式继承
  • 2.6、组合寄生式继承(最好的)
function A(){//类
         this.a="a"//成员属性
     }
 A.prototype.aa=function(){//原型上面的一个方法  prototype函数特定的原型写法
        console.log(this.a)
     }
 A.prototype.aaa=new C()
   
 function B(){//类
         this.b="b"
         A.call(this);//借用构造函数来继承a的属性
    }
 //B.prototype=A.prototype;
   B.prototype=new A();
   B.prototype.bb=function(){//原型上面的一个方法  prototype函数特定的原型写法
        console.log(this.b)
     }

     function C(){//类
         this.c="c"
         A.call(this);
     }
    C.prototype=new A();//注意:必须放在最前边
    C.prototype.cc=function(){
        console.log(this.c)
     }
     var a =new A();//实例化
     var b =new B();//实例化
     var C =new C();//实例化
    b.bb();//通过a.aa来调用原型上面的方法
    console.log(a)
    console.log(C)

<script>
    //01父类
    class Person {
        constructor(name) {
            this.name = name;
        }
        showName() {
            console.log("我是父类里面的showname")
            return `名字为:${this.name}`
        }
    }
    //子类
    class Student extends Person {
        constructor(name, skill) {
            super(name);//相当于将父级的构造函数再执行一次
            this.skill = skill;//子类的属性
        }
        showName(){
            super.showName();//如果直接写一个跟父类一样的函数名,会把父类里面的方法
            //覆盖掉,如不想覆盖super.showName()可以这样调用,使父类和子类一起执行
            console.log("我是子类里面的showname")
        }
        showSkill() {
            return `门生的技能为: ${this.skill}`
        }
    }
    let stu1 = new Student("strive", "逃学")
    console.log(stu1.showSkill());
    console.log("--------------------")
    console.log(stu1.showName());

</script>

3.多态

多态性指的是:同一操作作用与不同类的实例,将产生不同的执行结果,即不同类的对象收到相同的消息时,将得到不同的结果。 实现多态的三个必要条件:
1.继承
2.重写
3.父类引用指向子类对象
通俗来讲就是同一个函数,因为传递的参数列表不同,可以实现的不同的功能