JavaScript多态与封装实例分析


Posted in Javascript onJuly 27, 2018

本文实例讲述了JavaScript多态与封装。分享给大家供大家参考,具体如下:

1、静态语言类型和动态语言类型

编程语言按照数据类型可以分为静态语言类型和动态语言类型两大类。

1) 静态语言类型在编译时就已经确定变量的类型

优点:在编译时就能发现类型不匹配的错误,编译器可以帮助我们提前避免程序在运行期间可能发生的一些错误;在程序中明确规定了数据类型,编译器可以针对这些信息对程序进行优化工作。

缺点:迫使程序员依照契约来编写程序,为每个变量规定数据类型;类型的声明也会增加更多的代码,使得程序员难以专注于业务逻辑。

2) 动态类型语言的变量类型需要到程序运行的时候变量被赋值时才能确定。

优点:编写的代码数量少,简洁使得程序员可以更专注于业务逻辑。

缺点:无法保证变量的类型,在程序运行期间可能发生与类型有关的错误。

2、JavaScript多态

多态的思想实际上是:将"做什么"与"谁去做以及怎样去做"分离开,也就是将"不变的事物"与"可能改变的事物"分离开,把不变的事物隔离出来,把可变的部分封装起来。要实现这一点,归根结底就是要消除类型之间的耦合关系。

多态的最根本的作用是:通过把程序化的条件分支语句转化为对象的多态性,从而消除这些条件分支语句。

var student = {
  show: function() {
    console.log('我是学生');
  }
};
var teacher = {
  show: function() {
    console.log('我是老师');
  }
};
var showMe = function(type) {
  if (type == 'teacher')
    teacher.show();
  else if (type == 'student')
    teacher.show();
};
showMe('teacher');
showMe('student');

问题:一旦需要增加新的type对应的show()方法,必须改动showMe()函数。

解决:把程序中相同的部分抽离出来。

var student = {
  show: function() {
    console.log('我是学生');
  }
};
var teacher = {
  show: function() {
    console.log('我是老师');
  }
};
var showMe = function(obj) {
  if (obj.show instanceof Function)
    obj.show();
};
showMe('teacher');
showMe('student');

若需要增加doctor类型对象,只需增加:

var doctor = {
  show: function() {
    console.log('我是医生');
  }
};
showMe(doctor);

设计模式与多态:

绝大部分设计模式的实现都离不开多态性的思想。

3、封装

封装的目的是将信息隐藏。一般封装指的是封装数据和封装实现,但广义的封装还包括封装类型和封装变化。

1) 封装数据

JavaScript没有提供privatepublicprotected等关键字来实现不同的访问权限,只能依赖变量的作用域来实现封装特性,而且只能模拟出privatepublic两种封装性。

除了ES6中提供的let以外,一般通过函数来创建作用域。

var obj = (function() {
  var name = "Alice"; // 模拟private变量
  return {
    getName: function() { // 模拟public方法
      return name;
    }
  }
})();
console.log(obj.name); // 输出:undefined
console.log(obj.getName()); // 输出:Alice

2) 封装实现

从封装实现细节来讲,封装使得对象内部的变化对其他对象而言是透明的,也就是不可见的,对象对自己的行为负责,其他对象或用户不关心其内部实现。封装使得对象之间的耦合变松散,对象之间只通过暴露的API接口来通信。修改一个对象时,可以随意修改它的内部实现,只要对外的接口没有变化,就不会影响程序的其他功能。

例如,迭代器的作用是在不暴露一个聚合对象的内部表示的前提下,提供一种方式来顺序访问这个聚合对象,若有一个each函数,则使用它的人不必关心其内部实现,只有它可以提供正确的功能即可,即使each函数修改了源代码,只要对外的接口或调用方式没有变化,用户就不必关心其内部实现的改变。

3) 封装类型

封装类型是静态类型语言的一种重要封装方式。一般而言,封装类型是通过抽象类和接口来进行的,将对象的类型隐藏到抽象类或接口之后,相比对象的类型,用户更关心对象的行为。在许多静态类型语言的设计模式中,会想方设法地隐藏对象的类型,促使工厂模式、组合模式等设计模式诞生。

在JavaScript中,并没有对抽象类和接口的支持,在封装类型方面,JavaScript没有能力。

4) 封装变化

从设计模式的角度出发,封装更重要的层面体现为封装变化。

通过封装变化的方式,把系统中稳定不变的部分和容易变化的部分隔离开,在系统演变过程中,只需要替换那些容易变化的部分,若这些部分是封装好的,替换起来就会相对容易。

更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
破除一些网站复制、右键限制
Nov 04 Javascript
Prototype Template对象 学习
Jul 19 Javascript
extjs 学习笔记 四 带分页的grid
Oct 20 Javascript
jquery判断checkbox(复选框)是否被选中的代码
Oct 20 Javascript
JQuery对class属性的操作实现按钮开关效果
Oct 11 Javascript
JavaScript中的定时器之Item23的合理使用
Oct 30 Javascript
必备的JS调试技巧汇总
Jul 20 Javascript
Angular中$cacheFactory的作用和用法实例详解
Aug 19 Javascript
浅谈bootstrap使用中的一些问题以及解决过程
Oct 18 Javascript
JavaScript运动框架 解决防抖动问题、悬浮对联(二)
May 17 Javascript
vue-cli3搭建项目的详细步骤
Dec 05 Javascript
vue微信分享插件使用方法详解
Feb 18 Javascript
Vue配合iView实现省市二级联动的示例代码
Jul 27 #Javascript
react native 文字轮播的实现示例
Jul 27 #Javascript
Vue render渲染时间戳转时间,时间转时间戳及渲染进度条效果
Jul 27 #Javascript
浅析Vue项目中使用keep-Alive步骤
Jul 27 #Javascript
在vue中使用Autoprefixed的方法
Jul 27 #Javascript
JavaScript设计模式之观察者模式(发布订阅模式)原理与实现方法示例
Jul 27 #Javascript
Vue+Mock.js模拟登录和表格的增删改查功能
Jul 26 #Javascript
You might like
php简单实现MVC
2015/02/05 PHP
PHP后期静态绑定之self::限制实例分析
2018/12/21 PHP
PHP hebrev()函数用法讲解
2019/02/21 PHP
jquery搜索框效果实现方法
2015/01/16 Javascript
jQuery给多个不同元素添加class样式的方法
2015/03/26 Javascript
基于jQuery滑动杆实现购买日期选择效果
2015/09/15 Javascript
基于jquery实现图片相关操作(重绘、获取尺寸、调整大小、缩放)
2015/12/25 Javascript
JavaScript绑定事件监听函数的通用方法
2016/05/14 Javascript
js获取地址栏中传递的参数(两种方法)
2017/02/08 Javascript
jquery实现轮播图效果
2017/02/13 Javascript
详谈Angular 2+ 的表单(一)之模板驱动型表单
2017/04/25 Javascript
浅谈通过JS拦截 pushState和replaceState事件
2017/07/21 Javascript
Angular4绑定html内容出现警告的处理方法
2017/11/03 Javascript
jquery点击回车键实现登录效果并默认焦点的方法
2018/03/09 jQuery
vue cli4.0项目引入typescript的方法
2020/07/17 Javascript
[06:37]2014DOTA2国际邀请赛 昔日王者渴望重回巅峰
2014/07/12 DOTA
浅谈Python2获取中文文件名的编码问题
2018/01/09 Python
Python之reload流程实例代码解析
2018/01/29 Python
Python网络爬虫中的同步与异步示例详解
2018/02/03 Python
为何人工智能(AI)首选Python?读完这篇文章你就知道了(推荐)
2019/04/06 Python
解决Python安装时报缺少DLL问题【两种解决方法】
2019/07/15 Python
python 控制台单行刷新,多行刷新实例
2020/02/19 Python
HTML5中的音频和视频媒体播放元素小结
2016/01/29 HTML / CSS
The Hut美国/加拿大:英国领先的豪华在线百货商店
2019/03/26 全球购物
伦敦鲜花递送:Flower Station
2021/02/03 全球购物
C语言50道问题
2014/10/23 面试题
调解协议书
2014/04/16 职场文书
酒店爱岗敬业演讲稿
2014/09/02 职场文书
党的群众路线教育实践活动个人对照检查材料范文
2014/09/25 职场文书
村当支部个人对照检查材料思想汇报
2014/10/06 职场文书
群众路线四风自我剖析材料
2014/10/08 职场文书
入党现实表现材料
2014/12/23 职场文书
班级班风口号大全
2015/12/25 职场文书
PyTorch dropout设置训练和测试模式的实现
2021/05/27 Python
NodeJs使用webpack打包项目的方法详解
2022/02/28 NodeJs
Java基于Dijkstra算法实现校园导游程序
2022/03/17 Java/Android