ECMAScriptjavascript面向对象序列第四篇——OOP中的常见概念

面前的话

  面向对象描述了一种代码的集体结构格局——一种在软件中对实际世界中问题领域的建模方法。本文将从理论层面,介绍javascript面向对象程序程序(OOP)中有些普遍的定义

 

对象

  所谓目标,本质上就是指事物(包括人和物)在程序设计语言中的表现形式。这里的东西可以是此外事物(如某个客观存在的目的,或者某些较为抽象的概念)。例如,对于猫这种普遍对象的话,具有某些明确的特色(如颜色、名字、体型等),能执行某些动作(如喵喵叫、睡觉、躲起来、逃跑等)。在OOP语义中,那些目标特征都称呼属性,而这些动作则被誉为方法

  此外,还有一个口语方面的类比:对象往往是用名词意味着的(如book、person),方法一般都是些动词(如read、run),属性值则往往是一些形容词

“The black cat sleeps on my head”

  cat是一个对象,black是一个颜色属性值,sleep代表一个动作,也就是OOP语义中的方法。on
my head是动作sleep的限量条件。由此它可以看做传递给sleep方法的一个参数

 

  在现实生活中,相似对象期间多次都有一对同台的组合特征。例如蜂鸟和老鹰都负有鸟类的特征,由此它们可以被统称为鸟类。在OOP中,类实际上就是目标的筹划蓝图或创立配方。对象那些词,有时候也称为实例。所以,老鹰是小鸟的一个实例。可以依据同一个类创立出无数见仁见智的目的,因为类更多的是一种模板。而目标则是在这一个模板的底蕴上被创建出来的实业

  javascript实际上压根没有类。该语言的一切都是基于对象的,其借助的是一套原型(prototype)系统。而原型本身其实也是一种对象

  在传统的面向对象语言中,基于Person类成立了一个Match的新目的,而在javascript中,则是将现有的Person对象扩张成一个Match的新对象

 

封装

  封装紧要用以演说对象中所包含的内容。封装概念一般由两局部组成:相关的数码(用于存储属性)、基于那个数据所能做的事(所能调用的不二法门)

  封装的目标是将信息隐藏,即方法与特性的可见性。一般而言,封装包括封装数据和包装实现

  在诸多语言的目的系统中,封装数据是由语法解析来落实的,这一个语言提供了public、private、protected那个首要字来界定方法和性质的可见性,这种范围分类定义了对象用户所能访问的层次

  但javascript并从未提供对这一个重要字的援助,只能借助变量的成效域来兑现封装特性,
而且只好模拟出 public 和 private
这二种封装性。除了ECMAScript6中提供的let之外,一般经过函数来成立功效域:

var myObject = (function(){
  var  name = 'match';    // 私有(private)变量
  return {
    getName: function(){    // 公开(public)方法
      return  name;
    }
  }
})();
console.log( myObject.getName() );// 输出:match
console.log( myObject.name )    // 输出:undefined

  面向对象编程强调的是数量和操作数据的所作所为实为上是相互关联的,因而好的规划就是把数量以及和它相关的行为封装起来。举例来说,用来代表一个单词或者短语的一串字符通常被称为字符串。字符就是数量。可是关爱的屡屡不是数码是何许,而是可以对数码做什么样,所以可以接纳在这种数据上的行为(总括长度、添加数量、搜索等等)都被设计成
String 类的形式。所有字符串都是 String
类的一个实例,也就是说它是一个打包,包含字符数据和可以拔取在数码上的函数

  封装不仅仅是藏身数据,还包括隐形实现细节、设计细节以及隐藏对象的项目等

  从包装实现细节来讲,封装使得对象内部的更动对另外对象而言是透明的,也就是不可见的。
对象对它和谐的所作所为承担。其他对象或者用户都不爱慕它的中间贯彻。封装使得对象期间的耦合变松散,对象期间只经过表露的
API
接口来通信。当修改一个对象时,可以无限制地修改它的中间贯彻,只要对外的接口没有成形,就不会影响到程序的另外职能

 

聚合

  所谓聚合,有时候也号称组合,实际上是指将多少个现有对象合并成一个新目的的长河。可想而知,这一个定义强调的是将多少个对象合而为一的力量。通过集合这种强硬的不二法门,可以将一个题目分解成五个更小的题目。这样一来,问题就会体现更便于管理(便于各类击破)。当一个问题域的太过复杂时,就足以考虑将它分解成若干身材问题区,并且必要的话,这一个问题区还是可以再持续分解成更小的分区。这样做有利于从多少个不等的抽象层次来设想这些题目

  类似的事态如Book是由一个或多少个author对象,publisher对象、若干chapter对象以及一组table目的等组合而成的目的

 

继承

  通过持续这种措施,可以极度优雅地落实对现有代码的录用。在观念的OOP环境中,继承平时指的是类与类之间的涉及,但鉴于javascript中不存在类,由此它的持续只可以发出在目的之间

  比如,有一个Person的常见对象,其中饱含部分人名、性别之类的特性,以及部分功效性函数,如步行、谈话、睡觉、吃饭等。然后,需要一个Programmer对象时,可以让Programmer继承自Person,Programmer对象只需要实现属于它自己的这有些出色效能(如编写代码),而另外部分重用Person的实现即可

  当一个目的继承自另一个目的时,经常会往中间参预新的主意,以增添被连续的老对象。平日将这一进程称之为“B继承自A”或“B扩展自A”。其它对于新目的的话,它能够遵照自己的急需,从连续的这组方法中拔取多少个来重新定义。这样做并不会转移目的的接口,因为其方法名是同等的,只不过当调用新指标时,该形式的行事与事先不同了。那种重定义继承方法的长河叫做覆写

 

多态

  多态一词源于希腊文polymorphism,拆开来看是poly(复数)+morph(形态)+ism,从字面意思可以清楚为复数形态

  多态的莫过于意义是:同一个操作效能于不同的对象方面,可以生出不同的诠释和见仁见智的履行结果。换句话说,给不同的靶子发送同一个音信的时候,这一个目的会依照那些音讯分别交付不同的举报

  Programmer对象继承了上顶尖对象Person的享有办法。这意味着这多少个目标都实现了”talk”等方法。现在,代码中有一个叫作“Match”的变量,尽管是在不驾驭它是一个Person对象依旧一个Programmer对象的场所下,也依然得以一向调用该对象的”talk”方法,而无需顾虑这会潜移默化代码的例行干活。类似这种不同对象通过同样的措施调用来贯彻各自行为的力量,称之为多态

  多态背后的惦记是将“做如何”和“什么人去做以及如何去做”分离开来,也就是将“不变的事物”与“可能更改的东西”分离开来。把不变的一些隔断出来,把可变的部分包装起来,这给予了大家扩充程序的力量,程序看起来是可生长的,也切合开放——封闭原则,相对于修改代码来说,仅仅扩充代码就能到位同样的意义,这明确优雅和汉中得多

  多态最根本的功效是经过把过程化的基准分支语句转化为对象的多态性,从而解除这么些原则分支语句

 

总结

  下边来对下边提到的概念举办总计

  对象:Match是一个爱人(后者是一个对象)

  属性:Match是男性,黄皮肤,黑头发

  方法:Match能吃饭、睡觉、喝水、做梦

  类:Match是Programmer类的一个实例

  原型对象:Match是一个由Programmer对象扩张而来的新目的

  封装:Match对象涵盖了数据和基于这多少个数据的艺术

  聚合:Match只是整整Web开发公司对象的一有些,该团队还包括一个Designer对象Wang,以及一个ProjectManager对象Li

  继承:Designer、ProjectManager、Programmer都是个别扩张自Person对象的新对象

  多态:可以每天调用Match、Wang、Li这多少个目的分另外talk方法,它们都足以正常工作,即使那些措施会爆发不同的结果。如Match可能谈得更多的是代码的属性,Wang更倾向于谈代码的优雅性,而Li强调的是最终时限。不言而喻,每个对象都得以再度自定义它们的延续方法talk