美文网首页
ES6中的Class 封装与多态

ES6中的Class 封装与多态

作者: Spidd | 来源:发表于2021-12-29 15:58 被阅读0次

ES6中的class面向对象三要素之二是封装。今天继续回顾。

在Java中,实现了public完全开放、protected对子类开放、private对自己开放这三种封装的方式。但在ES6中目前并不支持,未来是否会支持也不知道,但这种封装的思想还是值得学习的,所以需要通过变通方法来模拟实现。

对于私有方法的模拟实现,有如下两种比较方便的实现方法。

方法一:在命名上加以区别,通常可以约定在类内部方法名前加下划线_来表示一个只限于内部的私有方法,但这种方法其实在外部依然可以被调用,只是一种约定而已,并不保险。

方法二:将私有方法放置在类外部,当类需要调用这个私有方法时,通过apply或call调用。

class ThatOne{
    constructor(){}
    foo(person){
        show.call(this, person)
    }
}
function show(person){      //将私有方法移到类外部
    console.log('my lover is ' + person);
}
console.log( (new ThatOne()).foo('sxm') );
//my lover is sxm

类中私有属性的模拟实现,暂无合适的方法,就不作多讨论了。

封装的优势有以下两点:

减少耦合,不该暴露的不暴露
利于对数据、接口进行相应的权限管理
至于多态,在JS中应用的很少。

多态的实际含义是:同一操作作用于不同的对象上面时,可以产生不同的解释和不同的执行结果。换句话说,就是给不同的对象发送同一消息时,这些消息会根据这个消息分别给出不同的反馈。

字面意思难以理解,直接上代码:

class People{
    constructor(name){
        this.name = name;
    }
    sayName(){}
}
class A extends People{
    constructor(name){
        super(name);
    }
    sayName(){
        console.log('I am A');
    }
}
class B extends People{
    constructor(name){
        super(name);
    }
    sayName(){
        console.log('I am B');
    }
}
(new A()).sayName();
(new B()).sayName();
//打印:
/*
I am A
I am B
*/

从上例可以看到,多态的思想实际就是把“做什么”和“谁来做”分离开来,要做到这点需要消除类型之间的耦合关系,在Java中可以通过向上转型实现多态。但在JS中无需这么麻烦,js的变量类型在运行期是可变的,一个js对象的多态性是与生俱来的,js作为一门动态弱类型语言,在编译时没有类型检查的过程,既没检查创建对象的类型,也没检查传递的参数类型,所以js中对象实现多态不取决于是否为某个类型的对象,而只取决于它是否有该方法。

对象的继承、封装和多态这三个要素在设计模式中的使用非常重要,只有深入理解这些要素,才能真正理解和灵活使用设计模式。

相关文章

  • ES6中的Class 封装与多态

    ES6中的class面向对象三要素之二是封装。今天继续回顾。 在Java中,实现了public完全开放、prote...

  • 4、TS 类

    1、类的三个特点:封装、继承、多态入门重点体验封装 2、回顾js中的构造函数 3、class用法 关于es6 cl...

  • 【Python】Class

    面对对象编程的三大特性:封装,继承,多态。 封装:create class class封装了Attribute和m...

  • golang-面向对象

    思考:go语言不支持继承与多态的优点与缺点是什么 go语言只支持封装,不支持继承与多态 go语言没有class,只...

  • TypeScript04--类

    类的三大特性: 封装,继承,多态(这个概念没什么好说的,本文会对比ts与es5,es6语法上的区别) 封装:...

  • 类的继承笔记

    特征:封装,继承,多态 对象的方法 self 参数 (相当于c++中的this指针) >>> class Ball...

  • 面向对象的三大特性

    封装 继承 多态 for example: 封装:有一个学生,把学生封装起来class Student{Strin...

  • Dart类的基础知识(一)

    class DartBasicLei { //dart 也是面向对象的语言,所以也继承,封装,多态的属性 //...

  • 深入理解JS面向对象 - JavaScript实现继承的五种方式

    一、类与实例 1. 类的声明 传统function类的声明 ES6中的class声明 1.1 ES6 class与...

  • 围绕localStorage封装的工具类ES6

    内容概要使用ES6语法,封装名为storageData的class,并有两个子类localData与saveDat...

网友评论

      本文标题:ES6中的Class 封装与多态

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