Skip to content

面向对象

✍️ w 🕒 2024-06-17 14:53:00(5 days ago) 🔗 A.前端知识整理

面向对象之前要知道什么是对象

面向对象(Object-Oriented Programming, OOP)是一种编程范式,它将软件设计和开发集中在对象的创建和操作上。面向对象编程旨在通过对象这一抽象实体来模拟现实世界中的事物,并通过对象之间的交互来实现复杂的系统功能。对象的三个特性(唯一标识性、状态、行为)帮助我们更好地管理和组织代码,从而提升代码的可读性、可维护性和可扩展性。

  1. 唯一标识性

    • 定义:每个对象都有其独特的身份,即使两个对象拥有完全相同的属性和方法,它们依然是独立的两个对象。
    • 意义:这强调了对象的个体性和不可替代性。在程序设计中,这意味着每个对象都有其独特的内存地址或标识符。
  2. 状态

    • 定义:对象有状态,这意味着同一个对象在不同时间点可能处于不同的状态。
    • 意义:对象的状态是通过其属性来体现的,而属性的值会变化。这种状态变化在程序运行期间对对象行为与功能有直接影响。
  3. 行为

    • 定义:对象具有行为,它的状态可能因为其行为而改变。
    • 意义:对象的行为是由方法实现的,通过调用这些方法,能够对对象的属性(状态)进行修改或者执行操作。
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);
		}    
};

面向对象编程的核心概念

  1. 对象(Object):对象是类的实例,集合了数据(属性)和行为(方法)。它们在运行时可以动态创建和销毁。

  2. 类(Class):类是对象的蓝图或模板,定义了一类对象具有的属性和方法。通过类可以创建多个具有相似特征的对象。

  3. 封装(Encapsulation):封装是将对象的属性和方法隐藏起来,只暴露必要的接口。这样可以保护对象的数据不被外部随意修改。

  4. 继承(Inheritance):继承是通过扩展已有类来创建新类的一种机制。新类称之为子类或派生类,它可以继承父类(基类)的方法和属性,并可以增加新的方法和属性或重写父类的方法。

  5. 多态(Polymorphism):多态是指同一个方法在不同对象中有不同的实现。多态使得可以用统一的接口来调用不同对象的方法,提高了代码的灵活性和可扩展性。

  6. 抽象(Abstraction):抽象是一种建模技术,关注对象的高层特征,而忽略具体的实现细节。它帮助简化复杂系统,使开发者可以专注于更高层次的问题。

面向对象编程的常用语言有Java、C++、Python、C#等。使用面向对象编程的主要优点包括:

  • 代码复用性高:通过继承和组合可以重用代码。
  • 可维护性强:代码的模块化和封装性提高了系统的可维护性。
  • 易于理解和组织:符合人类对现实世界的思考方式,便于理解和组织复杂系统。

面向对象两大类实现方式

在开始讨论面向对象编程(OOP)之前,先简要回顾一下编程语言的两大类实现方式:基于类和基于原型。这两种方式在实现OOP时虽然途径不同,但都是为了达成相同的目标。

1. 基于类(Class-based)

大部分开发者可能都是从学习基于类的编程语言开始,比如C++和Java。基于类的语言中,编程流程通常如下:

  • 定义类:先定义一个类,类包含属性(变量)和方法(函数)。
  • 实例化对象:通过类创建对象,称为类的实例。

这种方式促使开发者形成一种思维定式,认为所有编程语言都需要通过定义类来实现面向对象。这类语言强调分类及类之间的关系,常见的关系如继承和组合。类通常与语言的类型系统整合,提供了编译时的类型检查和多态性等能力。

2. 基于原型(Prototype-based)

JavaScript是基于原型设计的语言。在原型机制的编程语言中,有两种主要方式:

  • 引用原型:新对象持有一个原型对象的引用,共享其属性和方法。
  • 复制对象:直接复制原型对象,生成新的独立对象。

总结

根据以上描述,我们可以将编程语言分为两种类型:

  1. 基于类的系统

    • 强调分类和类之间的关系
    • 对象通过类实例化
    • 类与类之间形成继承、组合等复杂关系
    • 类与类型系统整合,提供编译时能力
  2. 基于原型的系统

    • 没有显式定义的类,通过对象实例创建新对象
    • 属性和方法可直接添加到对象实例中
    • 允许更高的灵活性,如随时添加新属性

这两种方式的差异主要在于:基于类的系统先定类后实例化对象,而基于原型的系统直接从对象创建新对象,无需类的定义。虽然JavaScript是基于原型的语言,但由于其在设计早期模仿了Java,引入了许多基于类的语言特性,如newthis。这使得开发者在实际使用中经常忽略了JavaScript原型链的独特优势。

需要注意的是,像Java这种基于类的语言,往往不允许随意向对象添加属性。而JavaScript则提供了这种灵活性,允许开发者在运行时随时为对象添加新属性或方法。这种灵活性也是JavaScript的一个显著优势。

无论是基于类还是基于原型,最终目标都是实现面向对象编程。两者只是实现方式不同,但本质都是通过对象进行封装和操作,旨在提高代码的复用性、可维护性和可理解性。因此,在选择编程语言和方法时,应根据具体需求和背景考虑,以便充分发挥各自的优势。

Released under the MIT License.