前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ES6中的Class回顾总结三:封装与多态

ES6中的Class回顾总结三:封装与多态

作者头像
前端_AWhile
发布2019-08-29 13:13:52
1.1K0
发布2019-08-29 13:13:52
举报
文章被收录于专栏:前端一会前端一会

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

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

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

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

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

代码语言:javascript
复制
 1class ThatOne{
 2    constructor(){}
 3    foo(person){
 4        show.call(this, person)
 5    }
 6}
 7function show(person){      //将私有方法移到类外部
 8    console.log('my lover is ' + person);
 9}
10console.log( (new ThatOne()).foo('sxm') );
11//my lover is sxm

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

封装的优势有以下两点:

  • 减少耦合,不该暴露的不暴露
  • 利于对数据、接口进行相应的权限管理

至于多态,在JS中应用的很少。

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

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

代码语言:javascript
复制
 1class People{
 2    constructor(name){
 3        this.name = name;
 4    }
 5    sayName(){}
 6}
 7class A extends People{
 8    constructor(name){
 9        super(name);
10    }
11    sayName(){
12        console.log('I am A');
13    }
14}
15class B extends People{
16    constructor(name){
17        super(name);
18    }
19    sayName(){
20        console.log('I am B');
21    }
22}
23(new A()).sayName();
24(new B()).sayName();
25//打印:
26/*
27I am A
28I am B
29*/

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

多态的优势主要在保持子类的开放性和灵活性。

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-12-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端小二 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档