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 相关文章推荐
js URL参数的拼接方法比较
Feb 15 Javascript
append和appendTo的区别以及appendChild用法
Dec 24 Javascript
js 触发select onchange事件代码
Mar 20 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件体系结构
Nov 19 Javascript
AngularJS上拉加载问题解决方法
May 23 Javascript
js实现3d悬浮效果
Feb 16 Javascript
基于Vue2.0+ElementUI实现表格翻页功能
Oct 23 Javascript
js键盘事件实现人物的行走
Jan 17 Javascript
vue项目使用高德地图的定位及关键字搜索功能的实例代码(踩坑经验)
Mar 07 Javascript
vue接口请求加密实例
Aug 11 Javascript
详解vue身份认证管理和租户管理
May 25 Vue.js
如何优化vue打包文件过大
Apr 13 Vue.js
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
在PHP3中实现SESSION的功能(二)
2006/10/09 PHP
sqlyog 中文乱码问题的设置方法
2008/10/19 PHP
php session 错误
2009/05/21 PHP
Php获取金书网的书名的实现代码
2010/06/11 PHP
php 一维数组的循环遍历实现代码
2017/04/10 PHP
关于php支持的协议与封装协议总结(推荐)
2017/11/17 PHP
javascript 定义初始化数组函数
2009/09/07 Javascript
Jquery+WebService 校验账号是否已被注册的代码
2010/07/12 Javascript
JavaScript中获取元素索引的函数
2010/09/10 Javascript
轻松创建nodejs服务器(1):一个简单nodejs服务器例子
2014/12/18 NodeJs
JavaScript之AOP编程实例
2015/07/17 Javascript
jQuery点击弹出层弹出模态框点击模态框消失代码分享
2017/01/21 Javascript
jQuery zTree树插件的使用教程
2019/08/16 jQuery
jQuery 选择器用法基础入门示例
2020/01/04 jQuery
JS co 函数库的含义和用法实例总结
2020/04/08 Javascript
VUE页面中通过双击实现复制表格中内容的示例代码
2020/06/11 Javascript
[59:07]海涛为你详解DOTA2新版本“贤哲秘契”
2014/11/22 DOTA
[48:21]Mski vs VGJ.S Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
用python实现的去除win下文本文件头部BOM的代码
2013/02/10 Python
KMP算法精解及其Python版的代码示例
2016/06/01 Python
Python实现微信小程序支付功能
2019/07/25 Python
基于YUV 数据格式详解及python实现方式
2019/12/09 Python
python3 sorted 如何实现自定义排序标准
2020/03/12 Python
利用python查看数组中的所有元素是否相同
2021/01/08 Python
CSS3教程(10):CSS3 HSL声明设置颜色
2009/04/02 HTML / CSS
生产经理的自我评价分享
2013/11/07 职场文书
高一生物教学反思
2014/01/17 职场文书
主管会计岗位职责
2014/03/13 职场文书
《乡下孩子》教学反思
2014/04/17 职场文书
高中生操行评语大全
2014/04/25 职场文书
交通处罚决定书
2015/06/24 职场文书
在人间读书笔记
2015/06/30 职场文书
会议营销主持词
2015/07/03 职场文书
一个家长教育孩子的心得体会
2016/01/15 职场文书
教你使用Pandas直接核算Excel中快递费用
2021/05/12 Python
Html5大屏数据可视化开发的实现
2021/06/11 HTML / CSS