JavaScript - js进阶 - 面向对象编程思想

本文介绍了面向对象编程(OOP)的基本概念,对比了面向过程编程,阐述了OOP的封装、继承和多态三大特性,并探讨了其优缺点。通过实例展示了如何在实际编程中运用面向对象的思想。
<!-- 
    
    面向对象: 是一种编程思想, 而不是技术


    面向对象编程思想对应的语言: 高级编程语言(类似于自然语言), 如java\JavaScript\C#\C++\PHP\Python...


    与面向对象对应的高级语言: 面向过程, 如C语言




    1. 面向过程(Procedure Oriented Programming): POP, 将一个业务过程(买棒棒糖), 拆解成具体的细节(节点), 然后用函数封装各个节点, 最后通过顺序调用函数,实现最终的业务功能
    


    具体实现过程


    1.1 拆解过程
    * 找到商店
    * 寻找商品
    * 交换(购买)
    * 交付商品


    1.2 函数实现(封装)
    * function getShop(){}
    * function getGoods(){}
    * function pay(){}
    * function finish(){}


    1.3 顺序调用
    * getShop()  得到商店
    * getGoods() 得到商品
    * pay()      真正得到商品
    * finish()   商品给需求者


    优缺点
    优点: 模块化编程思想(一个功能一个函数): 代码复用, 大型项目才有了可能(操作系统)
    缺点: 不是特别符合人类思维逻辑: 缺少对象(谁在买?)


    2. 面向对象(Object Oriented Programming): OOP, 在面向过程的基础之上, 先建立主体(Object:对象), 然后给主体提供过程功能(把函数放到对象内部), 调用的时候必须先得到对象(操作者), 然后由对象去实现对应的功能


    2.1 找到主体
    * 买家
    * 商店


    2.2 先定义主体结构
    * class Buyer{}
    * class Shop{}


    2.3 拆解业务过程
    * 买家: 找到商店
    * 买家: 寻找商品
    * 买家: 交换(购买) 商店提供商品
    * 买家: 交付商品


    2.4 函数实现(封装: 放到主体结构中)
    * class Buyer{
    *   function getShop(){}
    *   function getGoods(){}
    *   function finish(){}
    * }
    * 
    * class Shop{
    *   function pay(){}
    * }
    
    
    2.5 先得到主体, 然后由主体对象 去调用结构对应的功能
    * const b1 = new Buyer('周维')
    * const s1 = new Shop('校园商店')
    * 调用: b1.getShop().getGoods()  s1.pay()  b1.finish()


    优缺点
    优点: 基于面向过程, 也是模块化编程思想: 代码复用(比面向过程能实现更复杂的代码复用)
            后期维护容易, 数据具有追溯能力(更符合人类处理事务的思维)


    缺点: 前期开发难度较大, 代码量明显增加, 项目敏捷度降低(敏捷开发): 小项目不适合面向对象
            代码执行的效率降低


    
    面向对象有三大特性
    1. 封装: 将数据和数据的操作捆绑到一起,形成对外界的隐蔽, 但是同时提供对外可操作的接口
    class Student{
        // 数据: 属性
        name = '周维'
        age = 29


        // 数据的操作: 方法
        springFestval(){
            this.age++
        }
    }
    const s1 = new Student()
    s1.srpingFestval()          // 外部可调用


    2. 继承: 实现大量代码的复用
    class Person{
        age = 0


        eay(){}
        drink(){}
    }


    class Student extends Person{}
    const s1 = new Student('周维')
    s1.eat()
    s1.drink()


    3. 多态: 一种对象多种形态(java模拟: 有继承, 要重写)
    class Person{
        public static void eat(){ system.out.println('Person eat')}
        public static void drink(){ system.out.println('Person drink') }


    }


    class Student extends Person{   // extends发生继承
        public static void drink(){ system.out.println('Student drink') }   // 重写
    }


    产生对象: 强类型语言
    Person s = new Student()        // s是一个Perosn的对象, 对象的实体又是一个Student对象
    s.eat()                         // 输出: Person eat
    s.drink()                       // 输出: Student drink


    -->

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Henry_ww

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值