JavaScript面向对象当中的几个概念
JS面向对象过程中的几个概念
前言
面向对象描述的是一种代码组织解构的形式,一种在软件中对真实世界中问题领域的建模方法。
下面将从理论层面来介绍下面向对象编程中一些常见的概念。
对象
所谓对象,本质上就是指事物(包括人和物)在程序设计语言中的表现形式。这里的事物可以是任何东西(如某个客观存在的对象,或者某些较为抽象的概念)。例如,对于猫这种常见对象来说,具有某些明确的特征(如颜色、名字、体型等),能执行某些动作(如喵喵叫、睡觉、躲起来、逃跑等)。在OOP语义中,这些对象特征都叫做属性,而那些动作则被称为方法
此外,还有一个口语方面的类比:对象往往是用名词表示的(如book、person),方法一般都是些动词(如read、run),属性值则往往是一些形容词。
类
在现实生活中,相似对象之间往往都有一些共同的组成特征。例如蜂鸟和老鹰都具有鸟类的特征,因此它们可以被统称为鸟类。在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"方法,而不必担心这会影响代码的正常工作。类似这种不同对象通过相同的方法调用来实现各自行为的能力,称之为多态
多态背后的思想是将“做什么”和“谁去做以及怎样去做”分离开来,也就是将“不变的事物”与“可能改变的事物”分离开来。把不变的部分隔离出来,把可变的部分封装起来,这给予了我们扩展程序的能力,程序看起来是可生长的,也符合开放——封闭原则,相对于修改代码来说,仅仅增加代码就能完成同样的功能,这显然优雅和安全得多
多态最根本的作用是通过把过程化的条件分支语句转化为对象的多态性,从而消除这些条件分支语句。
JavaScript面向对象当中的几个概念的更多相关文章
- javascript面向对象系列第四篇——OOP中的常见概念
前面的话 面向对象描述了一种代码的组织结构形式——一种在软件中对真实世界中问题领域的建模方法.本文将从理论层面,介绍javascript面向对象程序程序(OOP)中一些常见的概念 对象 所谓对象,本质 ...
- JavaScript 面向对象程序设计(下)——继承与多态 【转】
JavaScript 面向对象程序设计(下)--继承与多态 前面我们讨论了如何在 JavaScript 语言中实现对私有实例成员.公有实例成员.私有静态成员.公有静态成员和静态类的封装.这次我们来讨论 ...
- Javascript面向对象研究心得
这段时间正好公司项目须要,须要改动fullcalendar日历插件,有机会深入插件源代码.正好利用这个机会,我也大致学习了下面JS的面向对象编程,感觉收获还是比較多的. 所以写了以下这篇文章希望跟大家 ...
- JavaScript面向对象旅程(下)
JavaScript面向对象旅程 剪不断,理还乱,是离愁. 前面已经提到过新语言开发的两个步骤,分别是:一.定义基本的数据类型,完善结构化编程语言的设计:二.为函数类型绑定this的概念,好在对象的方 ...
- JavaScript面向对象的三大特性
1.JavaScript面向对象的三大特性 JavaScript的三大特性:封装性.继承性.多态性. 2.JavaScript实现封装特性 在一些静态类型的语言如java中,本身语法就提供了这些功能. ...
- (二)我的JavaScript系列:JavaScript面向对象旅程(下)
剪不断,理还乱,是离愁. 前面已经提到过新语言开发的两个步骤,分别是:一.定义基本的数据类型,完善结构化编程语言的设计:二.为函数类型绑定this的概念,好在对象的方法中可以引用到对象自身.下面是继续 ...
- JavaScript面向对象之我见
序言 在JavaScript的大世界里讨论面向对象,都要提到两点:1.JavaScript是一门基于原型的面向对象语言 2.模拟类语言的面向对象方式.对于为什么要模拟类语言的面向对象,我个人认为:某些 ...
- Javascript本质第一篇:核心概念
很多人在使用Javascript之前都至少使用过C++.C#或Java,面向对象的编程思想已经根深蒂固,恰好Javascript在语法上借鉴了Java,虽然方便了Javascript的入门,但要深入理 ...
- 【转】javascript面向对象编程
摘要:本文本来是想自己写的,奈何花了好长时间写好之后忘记保存,还按了刷新键,一键回到解放前,索性不写了,所以本文是转载的. 面向对象编程是用抽象方式创建基于现实世界模型的一种编程模式,主要包括模块化. ...
随机推荐
- JAVA 流与文件
流 InputStream和OutputStream是所有的输入流和输出流的超类.他们两个都是抽象类. read方法和write方法都是阻塞方法,这意味着如果不能里可以写入或者读取,比如因为网络问题, ...
- 个人项目WordCount基础功能
码云地址:https://gitee.com/stedylan/WordCount 1.PSP表格: PSP2.1 PSP阶段 预估耗时 (分钟) 实际耗时 (分钟) Planning 计划 10 1 ...
- POJ - 1185 炮兵阵地 (插头dp)
题目链接 明明是道状压dp的题我为啥非要用插头dp乱搞啊 逐行枚举,设dp[i][S]为枚举到第i个格子时,状态为S的情况.S为当前行上的“插头”状态,每两个二进制位表示一个格子,设当前格子为(x,y ...
- 纯前端导出Excel表格
<html> <head> <p style="font-size: 20px;color: red;">使用a标签方式将json导出csv文件 ...
- vue基本语法 JS补充
目录 一.VUE框架入门 1. vue框架的优势 二.VUE框架的基本使用 1. vue的引用 2. vue的基本语法结构 2. 插值表达式 3. 文本指令 (1)v-text (2)v-html ( ...
- linux命令集锦 基于centos7---优化linux的命令
sed -i ‘s###g’ /etc/selinux/config 3个# 用于更改selinux配置文件:sed -i 's#SELINUX=enforcing#SELINUX=disabled ...
- Flyway的简单介绍和使用(转)
Flyway的简单介绍及使用 一.开发时管理数据库遇到的问题: 现在开发一般都是团队开发,这样就会出现项目同步的问题,代码同步可以通过SVN工具管理起来,那数据库同步怎么办呢?理想的情况下,在开发新项 ...
- laravel 之 cookie 使用
<?php namespace App\Http\Controllers\Admin; use Illuminate\Http\Request; use Illuminate\Http\Resp ...
- B/S文件夹上传下载组件
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 先说下要求: PC端全平台支持,要求支持Windows,Mac,Linux 支持所 ...
- CSS3 box-sizing:content-box | border-box
box-sizing:content-box | border-box 默认值:content-box 适用于:所有接受width和height的元素 继承性:无 content-box: paddi ...