【JS基础】别太忙了,停一停,简单聊聊JS的面向对象,说不定有新的收获

三特点

我们都知道面向对象有三个基本特点:封装继承多态。有多少开发终日埋头苦干,把这三个基本特点都忘记了哈哈。没关系,今天咱们稍微捡起来,说不定让你回看以前的代码时,有新的体会。

封装

说到封装,其实做平时做业务开发的时候就能体会到了,当引入一个第三方库的时候,我们根本不用去了解其源码,直接把库中导出的默认对象引入到组件里,就可以使用它带来的功能了。

再举个例子,咱们有时候会new一个实例,这个被new的东西也是一个封装的体现。例如new Promise,我们无需关系Promise内部具体是怎么实现的,用就完事。

一般封装的东西会有什么特点呢?大白话来说就是,你就用我给你的东西就行了,内部的其他东西你别动!

哈哈,举个例子,咱们用class写个类:

class Man {
    constructor(name,age){
        this.name = name;
        this.age = age;
    }
    getName(){
        let { name } = this;
        return name
    }
    static seyHi(){
        console.log("Hi");   
    }
}
let m = new Man("小马",18);
m.seyHi();   // m.seyHi is not a function 实例无法使用这个方法
m.getName();  // 小马
Man.seyHi();  // Hi 类直接使用这个方法
Man.getName();  //  not a function 类无法使用普通的方法

类中用 static 修饰符,对seyHi方法做了访问权限的封装,也就是改变其为静态方法,seyHi只属于Man这个类。只有类能直接调用,实例访问不了静态方法。

getName方法是属于实例的,类也无法使用普通的内置方法。

这也就解释了为啥有些内置对象无法直接使用一些方法。例如Promse。

Promise.then() // is not a function 说明then是个普通的内置方法,需要实例化后才能使用
let p1 = new Promise(() => {})
p1.then();  //  像这样

// .all的方法就是静态方法,所以可直接使用
Promise.all([fn])

继承

继承就是子类可继承父类的属性和方法,并且也能有自己独有的属性和方法。可以说是一浪更比一浪强哈哈。

可以直接看:【es6入门】类的声明与继承,class与extends语法糖,如何用原型模拟继承

多态

简单理解就是类的状态可以不是写死的,可以是灵活多变的。

多态的表现形式有重写和重载。

重写

就是子类继承的时候可以直接把自己写个和父类一样的东西,这样子类实例化变量在调用这个方法时,直接从子类原型上调用,而补充父类原型上调用了。

还是拿博客中的例子:

class Man {
    constructor(name){
        this.name = name;
    }
    seyHello(){
        console.log("Hello")
    }
}
class Son extends Man{
    constructor(name){
        super(name);
    }
    seyHello(){
        console.log(`Hello World`)
    }
}
const m = new Man("小马");
m.seyHello(); //  Hello World

能看到子类把seyHello方法进行了重写。

重载

可以理解为一个大类中包含几个小类,根据需求实例化出不同的类。

这里拿别人的例子(忘记从哪里看来的了,当时顺带修改了错误):

class Employees {
    constructor(arg){
        let obj = null;
        switch(typeof arg)
        {
            case "string":
                  obj = new StringEmployees(arg);
                  break;
            case "object":
                  obj = new ObjEmployees(arg);
                  break;
            case "number":
                obj = new NumberEmployees(arg);
                break;
        }
        return obj;
    }
}
class ObjEmployees {
    constructor(arg){
        console.log("ObjEmployees")
    }
}
class StringEmployees {
    constructor(arg){
        console.log("StringEmployees")
    }
}
class NumberEmployees {
    constructor(arg){
        console.log("NumberEmployees")
    }
}
new Employees({})   // ObjEmployees
new Employees("123456") //  StringEmployees
new Employees(987654)   //  NumberEmployees

这就是一个简单的重载。


我的理解

JS面向对象个人还是有些自己的理解心得,若有错误欢迎指出学习。

面向对象的开发优点:

从小的角度来说:

  1. 减少代码量;
  2. 减少开发理解精力;
  3. 降低编写程序的难度;
  4. 提升开发效率;
  5. 加强维护性;

从大的角度来说:

  1. 让项目代码能够更好的复用,扩展和工程化;
  2. 后续语言原生支持面向对象会是语言发展必然基础;

抛开高级开发,其实,在写业务的时候,无时无刻都在践行着面向对象的开发思想,如果解到JS和Pythone一样,有着万物皆为对象的特性后,再去看看自己的日常开发,哪个东西不是对象,我们的第三方库、自己写的组件,对接的接口,一个个函数…这些都给开发人员带来了无数的便利。

当然,面向过程开发我认为是不会有过时这种说法的,因为我觉得面向对象和面向过程这两者是相辅相成的,我相信未来的高级语言开发会是面向过程,面向对象,面向API的完美融合方式。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值