一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

JavaScript多态与封装实例分析

时间:2022-06-25 15:53:23 编辑:袖梨 来源:一聚教程网

本文实例讲述了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) 封装变化

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

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

热门栏目