Appearance
面向对象之前要知道什么是对象
面向对象(Object-Oriented Programming, OOP)是一种编程范式,它将软件设计和开发集中在对象的创建和操作上。面向对象编程旨在通过对象这一抽象实体来模拟现实世界中的事物,并通过对象之间的交互来实现复杂的系统功能。对象的三个特性(唯一标识性、状态、行为)帮助我们更好地管理和组织代码,从而提升代码的可读性、可维护性和可扩展性。
唯一标识性
- 定义:每个对象都有其独特的身份,即使两个对象拥有完全相同的属性和方法,它们依然是独立的两个对象。
- 意义:这强调了对象的个体性和不可替代性。在程序设计中,这意味着每个对象都有其独特的内存地址或标识符。
状态
- 定义:对象有状态,这意味着同一个对象在不同时间点可能处于不同的状态。
- 意义:对象的状态是通过其属性来体现的,而属性的值会变化。这种状态变化在程序运行期间对对象行为与功能有直接影响。
行为
- 定义:对象具有行为,它的状态可能因为其行为而改变。
- 意义:对象的行为是由方法实现的,通过调用这些方法,能够对对象的属性(状态)进行修改或者执行操作。
js
var a1 = {o:1}
var a2 = {o:2}
console.log(a1 === a2) // false 我们都知道对象本质是内存地址的指向,因此a1和a2看起来像本质也是不同的
// '行为'就是'方法','状态'就是'属性'
var o = {
d: 1, // 我是属性
f() { // 我也是属性
console.log(this.d);
}
};
面向对象编程的核心概念
对象(Object):对象是类的实例,集合了数据(属性)和行为(方法)。它们在运行时可以动态创建和销毁。
类(Class):类是对象的蓝图或模板,定义了一类对象具有的属性和方法。通过类可以创建多个具有相似特征的对象。
封装(Encapsulation):封装是将对象的属性和方法隐藏起来,只暴露必要的接口。这样可以保护对象的数据不被外部随意修改。
继承(Inheritance):继承是通过扩展已有类来创建新类的一种机制。新类称之为子类或派生类,它可以继承父类(基类)的方法和属性,并可以增加新的方法和属性或重写父类的方法。
多态(Polymorphism):多态是指同一个方法在不同对象中有不同的实现。多态使得可以用统一的接口来调用不同对象的方法,提高了代码的灵活性和可扩展性。
抽象(Abstraction):抽象是一种建模技术,关注对象的高层特征,而忽略具体的实现细节。它帮助简化复杂系统,使开发者可以专注于更高层次的问题。
面向对象编程的常用语言有Java、C++、Python、C#等。使用面向对象编程的主要优点包括:
- 代码复用性高:通过继承和组合可以重用代码。
- 可维护性强:代码的模块化和封装性提高了系统的可维护性。
- 易于理解和组织:符合人类对现实世界的思考方式,便于理解和组织复杂系统。
面向对象两大类实现方式
在开始讨论面向对象编程(OOP)之前,先简要回顾一下编程语言的两大类实现方式:基于类和基于原型。这两种方式在实现OOP时虽然途径不同,但都是为了达成相同的目标。
1. 基于类(Class-based)
大部分开发者可能都是从学习基于类的编程语言开始,比如C++和Java。基于类的语言中,编程流程通常如下:
- 定义类:先定义一个类,类包含属性(变量)和方法(函数)。
- 实例化对象:通过类创建对象,称为类的实例。
这种方式促使开发者形成一种思维定式,认为所有编程语言都需要通过定义类来实现面向对象。这类语言强调分类及类之间的关系,常见的关系如继承和组合。类通常与语言的类型系统整合,提供了编译时的类型检查和多态性等能力。
2. 基于原型(Prototype-based)
JavaScript是基于原型设计的语言。在原型机制的编程语言中,有两种主要方式:
- 引用原型:新对象持有一个原型对象的引用,共享其属性和方法。
- 复制对象:直接复制原型对象,生成新的独立对象。
总结
根据以上描述,我们可以将编程语言分为两种类型:
基于类的系统:
- 强调分类和类之间的关系
- 对象通过类实例化
- 类与类之间形成继承、组合等复杂关系
- 类与类型系统整合,提供编译时能力
基于原型的系统:
- 没有显式定义的类,通过对象实例创建新对象
- 属性和方法可直接添加到对象实例中
- 允许更高的灵活性,如随时添加新属性
这两种方式的差异主要在于:基于类的系统先定类后实例化对象,而基于原型的系统直接从对象创建新对象,无需类的定义。虽然JavaScript是基于原型的语言,但由于其在设计早期模仿了Java,引入了许多基于类的语言特性,如new
和this
。这使得开发者在实际使用中经常忽略了JavaScript原型链的独特优势。
需要注意的是,像Java这种基于类的语言,往往不允许随意向对象添加属性。而JavaScript则提供了这种灵活性,允许开发者在运行时随时为对象添加新属性或方法。这种灵活性也是JavaScript的一个显著优势。
无论是基于类还是基于原型,最终目标都是实现面向对象编程。两者只是实现方式不同,但本质都是通过对象进行封装和操作,旨在提高代码的复用性、可维护性和可理解性。因此,在选择编程语言和方法时,应根据具体需求和背景考虑,以便充分发挥各自的优势。