没有合适的资源?快使用搜索试试~ 我知道了~
深入理解JavaScript系列(17):面向对象编程之概论详细介绍
0 下载量 20 浏览量
2020-12-01
21:42:25
上传
评论
收藏 144KB PDF 举报
温馨提示
介绍 在本篇文章,我们考虑在ECMAScript中的面向对象编程的各个方面(虽然以前在许多文章中已经讨论过这个话题)。我们将更多地从理论方面看这些问题。 特别是,我们会考虑对象的创建算法,对象(包括基本关系 – 继承)之间的关系是如何,也可以在讨论中使用(我希望将消除之前对于JavaScript中OOP的一些概念歧义)。 英文原文:http://dmitrysoshnikov.com/ecmascript/chapter-7-1-oop-general-theory/ 概论、范式与思想 在进行ECMAScript中的OOP技术分析之前,我们有必要掌握一些OOP基本的特征,并澄清概论中的主要概念
资源推荐
资源详情
资源评论
深入理解深入理解JavaScript系列(系列(17):面向对象编程之概论详细介):面向对象编程之概论详细介
绍绍
介绍介绍
在本篇文章,我们考虑在ECMAScript中的面向对象编程的各个方面(虽然以前在许多文章中已经讨论过这个话题)。我们将
更多地从理论方面看这些问题。 特别是,我们会考虑对象的创建算法,对象(包括基本关系 – 继承)之间的关系是如何,也
可以在讨论中使用(我希望将消除之前对于JavaScript中OOP的一些概念歧义)。
英文原文:http://dmitrysoshnikov.com/ecmascript/chapter-7-1-oop-general-theory/
概论、范式与思想概论、范式与思想
在进行ECMAScript中的OOP技术分析之前,我们有必要掌握一些OOP基本的特征,并澄清概论中的主要概念。
ECMAScript支持包括结构化、面向对象、函数式、命令式等多种编程方式,某些情况下还支持面向方面编程;但本文是讨论
面向对象编程,所以来给出ECMAScript中面向对象编程的定义:
ECMAScript是基于原型实现的面向对象编程语言。
基于原型的OOP和基于静态类的方式直接有很多差异。 让我们一起来看看他们直接详细的差异。
基于类特性和基于原型基于类特性和基于原型
注意,在前面一句很重要的一点已经指出的那样-完全基于静态类。 随着“静态”一词,我们了解静态对象和静态类,强类型
(虽然不是必需的)。
关于这种情况,很多论坛上的文档都有强调这是他们反对将在JavaScript里将“类与原型”进行比较的主要原因,尽管他们在实
现上的有所不同(例如基于动态类的Python和Ruby)不是太反对的重点(某些条件写,尽管思想上有一定不同,但
JavaScript没有变得那么另类),但他们反对的重点是静态类和动态原型(statics + classes vs. dynamics + prototypes),确切
地说,一个静态类(例如:C + +,JAVA)和他的属下及方法定义的机制可以让我们看到它和基于原型实现的准确区别。
但是,让我们来一个一个列举一下。 让我们考虑总则和这些范式的主要概念。
基于静态类基于静态类
在基于类的模型中,有个关于类和实例的概念。 类的实例也常常被命名为对象或范例 。
类与对象
类代表了一个实例(也就是对象)的抽象。在这方面有点像数学,但我们一把称之为类型(type)或分类(classification)。
例如(这里和下面的例子都是伪代码):
代码如下:
C = Class {a, b, c} // 类C, 包括特性a, b, c
实例的特点是:属性(对象描述 )和方法(对象活动)。特性本身也可视为对象:即属性是否可写的,可配置,可设置的
(getter/setter)等。因此,对象存储了状态 (即在一个类中描述的所有属性的具体值),类为他们的实例定义了严格不变的
结构(属性)和严格不变的行为(方法)。
代码如下:
C = Class {a, b, c, method1, method2}
c1 = {a: 10, b: 20, c: 30} // 类C是实例:对象с1
c2 = {a: 50, b: 60, c: 70} // 类C是实例:对象с2,拥有自己的状态(也就是属性值)
层次继承层次继承
为了提高代码重用,类可以从一个扩展为另一个,在加上额外的信息。 这种机制被称为(分层)继承 。
代码如下:
D = Class extends C = {d, e} // {a, b, c, d, e}
d1 = {a: 10, b: 20, c: 30, d: 40, e: 50}
在类的实例上调用方的时候,通常会现在原生类本书就查找该方法,如果没找到就到直接父类去查找,如果还没找到,就到父
类的父类去查找(例如严格的继承链上),如果查到继承的顶部还没查到,那结果就是:该对象没有类似的行为,也没办法获
取结果。
代码如下:
d1.method1() // D.method1 (no) -> C.method1 (yes)
d1.method5() // D.method5 (no) -> C.method5 (no) -> no result
与在继承里方法不复制到一个子类相比,属性总是被复杂到子类里的。 我们可以看到子类D继承自父类C类:属性a,b,c是复制
过去了,D的结构是{a, b, c, d, e} } 。然而,方法{method1, method2}是没有复制过去,而是继承过去的。 因此,也就是说如
果一个很深层次的类有一些对象根本不需要的属性的话,那子类也有拥有这些属性。
基于类的关键概念基于类的关键概念
因此,我们有如下关键概念:
1.创建一个对象之前,必须声明类,首先有必要界定其类
2.因此,该对象将由抽象成自身“象形和相似性”(结构和行为)的类里创建
3.方法是通过了严格的,直接的,一成不变的继承链来处理
4.子类包含了继承链中所有的属性(即使其中的某些属性是子类不需要的);
5.创建类实例,类不能(因为静态模型)来改变其实例的特征(属性或方法);
6.实例(因为严格的静态模型)除了有该实例所对应类里声明的行为和属性以外,是不能额外的行为或属性的。
让我们看看在JavaScript里如何替代OOP模型,也就是我们所建议的基于原型的OOP。
基于原型
这里的基本概念是动态可变对象。转换(完整转换,不仅包括值,还包括特性)和动态语言有直接关系。下面这样的对象可以
独立存储他们所有的特性(属性,方法)而不需要的类。
代码如下:
object = {a: 10, b: 20, c: 30, method: fn};
object.a; // 10
object.c; // 30
object.method();
此外,由于动态的,他们可以很容易地改变(添加,删除,修改)自己的特性:
代码如下:
object.method5 = function () {…}; // 添加新方法
object.d = 40; // 添加新属性 “d”
delete object.c; // 删除属性 “с”
object.a = 100; // 修改属性 “а”
// 结果是: object: {a: 100, b: 20, d: 40, method: fn, method5: fn};
也就是说,在赋值的时候,如果某些特性不存在,则创建它并且将赋值与它进行初始化,如果它存在,就只是更新。
在这种情况下,代码重用不是通过扩展类来实现的,(请注意,我们没有说类没办法改变,因为这里根本没有类的概念),而
是通过原型来实现的。
原型是一个对象,它是用来作为其他对象的原始copy,或者如果一些对象没有自己的必要特性,原型可以作为这些对象的一
个委托而当成辅助对象。
基于委托基于委托
任何对象都可以被用来作为另一个对象的原型对象,因为对象可以很容易地在运行时改变它的原型动态。
注意,目前我们正在考虑的是概论而不是具体实现,当我们在ECMAScript中讨论具体实现时,我们将看到他们自身的一些特
点。
例(伪代码):
代码如下:
x = {a: 10, b: 20};
y = {a: 40, c: 50};
y.[[Prototype]] = x; // x是y的原型
y.a; // 40, 自身特性
y.c; // 50, 也是自身特性
y.b; // 20 – 从原型中获取: y.b (no) -> y.[[Prototype]].b (yes): 20
delete y.a; // 删除自身的”а”
y.a; // 10 – 从原型中获取
z = {a: 100, e: 50}
y.[[Prototype]] = z; // 将y的原型修改为z
y.a; // 100 – 从原型z中获取
y.e // 50, 也是从从原型z中获取
z.q = 200 // 添加新属性到原型上
y.q // 修改也适用于y
这个例子展示了原型作为辅助对象属性的重要功能和机制,就像是要自己的属性一下,和自身属性相比,这些属性是委托属
性。这个机制被称为委托,并且基于它的原型模型是一个委托的原型(或基于委托的原型 ) 。引用的机制在这里称为发送信
息到对象上,如果这个对象得不到响应就会委托给原型来查找(要求它尝试响应消息)。
剩余9页未读,继续阅读
资源评论
weixin_38622962
- 粉丝: 3
- 资源: 903
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 2023商品销售数据.csv
- 数据库MySQL课程设计及实践操作教程
- 基于 .Net 框架的用来替代 vbs 的 Windows 脚本工具集
- 基于非线性自行车模型的 MPC和 Pure-Pursuit 控制器的探测车+C++项目源码+文档说明+代码注释
- 基于深度学习的人脸识别口罩检测算法研究图片预处理和数据增强技术来提升模型性能
- java服装进销存管理系统源码数据库 MySQL源码类型 WebForm
- java项目,课程设计-ssm旅游资源网站.zip
- 【小程序毕业设计】基于微信小程序在线电子书阅读系统源码(完整前后端+mysql+说明文档).zip
- 这是关于内网渗透的一些资料和工具
- 【Unity中世纪道具资源包】Stylized Medieval Props Set I
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功