Object Oriented Programming
面向对象编程 (Object Oriented Programming)
面向对象编程是一种基于 对象 概念的编程范例,对象可以以字段的形式包含数据(通常被称为属性),以程序的形式包含代码(通常被称为方法)。
对象的一个特点就是它的方法可以访问和修改与之关联的对象的数据字段。在面向对象编程中,计算机程序被设计为由能够互相交互的对象们组成。面向对象编程语言是多种多样,最受欢迎的是基于类(Class)的那些。
面向对象编程的特征
通常,面向对象编程被理解为一种将程序分解为封装数据及相关操作的模块的编程范例。它的特征如下:
类与对象
支持面向对象编程的语言通常使用继承类来达到代码重用或可扩展性。
- 类 :定义了事物的抽象特点
- 对象 :类的实例
动态配置( dynamic dispatch )与消息传递机制
对象的任务是通过选择执行合适的程序代码响应方法调用,通常这种选择是在运行时查找与对象关联的表中的方法来实现的。这被称之为动态分配,它将对象与抽象数据类型(或模块)区分开来,后者具有所有实例的操作静态实现。
方法调用也被称之为消息传递。它被概念化为传递给对象进行分配的消息(即方法的名称和输入的参数)。
封装
封装是面向对象编程的一个概念,它将数据和对数据的操作绑定在一起,并保护它们免受外部的干扰和误用(仅让允许的类和对象进行访问)。数据封装引入了重要的面向对象编程数据隐藏概念。
如果一个类不允许调用代码直接访问对象内部的数据,而只允许通过它提供的方法进行访问,这种强大的抽象或信息隐藏被称之为封装。
具备封装性的面向对象编程隐藏了某一方法对的具体执行过程,取而代之的是通过消息传递机制传递消息给它。
继承
几乎所有支持类的语言都支持继承。继承使得类能够以层级结构表示
is-a-type-of的关系。父类的所有数据和方法都能被子类以同样的名字所继承,这使得相同的代码和数据复用变得更加简单,而且还是镜像真实世界关系的一种直观方式。子类可以重写父类定义的方法。在一些语言中存在多重继承,这可能会造成重写冲突。
抽象类不能实例化为对象,它们的存在只是为了可以被继承到其它可以被实例化的具体类中。
继承的过程就是一个从一般到特殊的过程。
多态
多态是指有继承产生的相关但不同的类,对统一消息会做出不同的响应。它能极大减少类型之间的耦合。
抽象
JavaScript 与面向对象编程
JavaScript 的核心是支持面向对象的,同时它也提供了强大灵活的 OOP 语言能力。
命名空间
命名空间是一个容器,它允许开发人员在一个独特的、特定于应用程序的名称下捆绑所有功能。在 JavaScript 中,命名空间是一个包含方法、属性和对象的对象,它和普通对象在语言层面上并无差别。
使用命名空间可以最大程度上减少应用程序名称冲突的可能性。
自定义对象
类
JavaScript 是基于原型的语言,并没有声明类的语句。它使用函数做类,定义一个类和定义一个函数相同。
1 | function Person() {} |
对象
对象是类的实例。
1 | function Person() {} |
构造器
构造器在实例化时被调用,它是对象中的一个方法,常用于给对象的属性赋值或者为调用函数做准备。在 JavaScript 中函数就可以作为构造器使用,因此不需要特别地定义一个构造器方法,每个声明的函数都可以在实例化后被调用执行。
属性
属性就是类中包含的变量。每一个对象实例有若干个属性. 为了正确的继承,属性应该被定义在类的原型属性 (函数)中。
可以使用 this 关键字调用类的属性,它是对当前对象的引用。
1 | function Person(name) { |
方法
在JavaScript中方法通常是一个绑定到对象中的普通函数, 这意味着方法可以在其所在上下文之外被调用。
1 | function Person(name) { |
在方法调用的过程中,this 的值取决于我们如何调用方法。可以通过 Function#call 或 Funcation#apply 显式的指定 this 的值。
继承
在 Javascript 中,继承通过赋予子类一个父类的实例并专门化子类来实现。在现代浏览器中你可以使用 Object.create() 实现继承。
1 | function Person() {} |
封装
类的实例调用存在于类中的方法时,并不清楚它是如何实现并运行的,这就是封装。
抽象
抽象是允许模拟工作问题中通用部分的一种机制。这可以通过继承(具体化)或组合来实现。
JavaScript通过继承实现具体化,通过让类的实例是其他对象的属性值来实现组合。
多态
就像所有定义在原型属性内部的方法和属性一样,不同的类可以定义具有相同名称的方法;方法是作用于所在的类中。并且这仅在两个类不是父子关系时成立(继承链中,一个类不是继承自其他类)。
Object Oriented Programming
https://cocoalei.github.io/blogs/2018/03/13/ObjectOrientedProgramming/