【Web前端】OOP编程范式

面向对象编程(Object-Oriented Programming,简称 OOP)是一种程序设计思想,它通过将程序视为一组相互作用的对象来设计程序。OOP 提出了一些重要的基本概念,包括类与实例、继承和封装。面向对象编程将系统视为由多个对象组成的集合,每个对象代表系统的某个特定方面。对象包含方法和数据。一个对象可以向代码的其他部分提供公共接口,使得其他部分能够通过这个接口执行对象的特定操作,而不需要关心对象内部是如何实现这些操作的,从而维护了对象内部状态的私密性。


一、类与实例

1.1 类(Class)

类是一个蓝图或模板,用于创建对象(实例)。它定义了对象的属性和方法,但并不是对象本身。类可以看作是对某一类事物的抽象描述。例如,可以创建一个表示“汽车”的类,这个类可以包含品牌、颜色、和速度等属性,以及加速和刹车等方法。

伪代码例子

class Car {// 属性string brand;string color;int speed;// 构造函数Car(string b, string c) {brand = b;color = c;speed = 0;}// 方法void accelerate(int increase) {speed += increase;print("Current speed: " + speed);}void brake(int decrease) {speed -= decrease;if (speed < 0) {speed = 0;}print("Current speed: " + speed);}
}

我们定义了一个名为 ​​Car​​ 的类,包含了三个属性 ​​brand​​、​​color​​ 和 ​​speed​​,以及两个方法 ​​accelerate​​ 和 ​​brake​​​。构造函数用于初始化对象的属性。


1.2 实例(Instance)

实例是根据类创建的具体对象。每个实例都有自己的属性值,尽管它们都是根据同一个类创建的。继续之前的例子,可以使用 ​​Car​​​ 类创建多个汽车对象。

伪代码例子

// 创建实例
Car myCar = new Car("Toyota", "Red");
Car anotherCar = new Car("Honda", "Blue");// 调用方法
myCar.accelerate(50);
myCar.brake(20);
anotherCar.accelerate(30);

这里创建了两个实例 ​​myCar​​ 和 ​​anotherCar​​,并分别调用它们的方法。每个实例都有自己的 ​​speed​​​ 属性,彼此之间不会相互影响。


二、继承

2.1 继承(Inheritance)

继承是面向对象编程的一个重要特性,它允许一个类(子类)从另一个类(父类)继承属性和方法。通过继承,我们可以创建一个更具体的类,而不需要重新定义所有的特性,从而实现代码的重用。

在继承中,子类可以拥有父类的所有属性和方法,同时也可以添加自己的特性。

伪代码例子

class Vehicle {string brand;string color;Vehicle(string b, string c) {brand = b;color = c;}void displayInfo() {print("Brand: " + brand);print("Color: " + color);}
}class Car extends Vehicle {int speed;Car(string b, string c) : Vehicle(b, c) {speed = 0;}void accelerate(int increase) {speed += increase;print("Current speed: " + speed);}
}

定义了一个父类 ​​Vehicle​​,它有 ​​brand​​ 和 ​​color​​ 两个属性以及一个方法 ​​displayInfo​​。接着,我们定义了一个子类 ​​Car​​,它继承了 ​​Vehicle​​ 类,同时添加了一个新的属性 ​​speed​​ 和一个方法 ​​accelerate​​。


2.2 使用继承

通过继承,我们可以轻松地创建一个新的对象,而不必重复编写代码。

伪代码例子

// 创建 Car 实例
Car myCar = new Car("Toyota", "Red");// 调用父类和子类的方法
myCar.displayInfo();  // 调用父类方法
myCar.accelerate(50); // 调用子类方法

这段代码我们创建了一个 ​​Car​​ 的实例 ​​myCar​​,并利用从 ​​Vehicle​​ 类继承过来的方法 ​​displayInfo​​​ 来显示信息。


三、封装

3.1 封装(Encapsulation)

当其他代码部分需要对对象执行某些操作时,可以通过对象提供的接口来完成这些操作。这种方式确保了对象的内部状态不被外部代码随意更改。换句话说,对象的内部状态是私有的,外部代码只能通过对象提供的接口来访问和修改这些内部状态,而不能直接对其进行访问或更改。维护对象内部状态的私密性,并明确区分对象的公共接口与内部状态,这种特性被称为封装(encapsulation)。封装的目的是保护对象的内部状态,防止外部不当操作导致的错误。通常使用访问修饰符(如 public、private、protected)来控制对类成员的访问。

封装的优势在于,当程序员需要对某个对象的特定操作进行修改时,只需更改该对象相关方法的内部实现,而无需在整个代码中寻找并逐一更新该方法的所有实现。从某种角度来看,封装在对象内部和外部形成了一种独特的“防护屏障”。

伪代码例子

class BankAccount {private double balance; // 私有属性BankAccount(double initialBalance) {balance = initialBalance;}public void deposit(double amount) {if (amount > 0) {balance += amount;print("Deposited: " + amount);}}public void withdraw(double amount) {if (amount > 0 && amount <= balance) {balance -= amount;print("Withdrawn: " + amount);} else {print("Insufficient funds");}}public double getBalance() {return balance; // 提供外部访问余额的方法}
}

​BankAccount​​ 类有一个私有属性 ​​balance​​,通过 ​​public​​ 方法 ​​deposit​​、​​withdraw​​ 和 ​​getBalance​​ 来操作和访问 ​​balance​​​。这种方式确保了类的内部状态不会被随意修改,有利于保持数据的一致性和安全性。


3.2 使用封装

通过封装,我们可以确保对象的状态始终有效。

伪代码例子

// 创建 BankAccount 实例
BankAccount myAccount = new BankAccount(1000);// 操作账户
myAccount.deposit(500);
myAccount.withdraw(200);
print("Current balance: " + myAccount.getBalance());

创建了一个 ​​BankAccount​​ 的实例,并通过 ​​deposit​​、​​withdraw​​ 和 ​​getBalance​​​ 方法安全地操作账户余额。


四、面向对象编程与 JavaScript

4.1 JavaScript 中的面向对象编程

虽然 JavaScript 是一门基于原型的语言,但它同样支持面向对象编程的概念。从 ECMAScript 6 开始,JavaScript 引入了 ​​class​​ 关键字,允许开发者以更接近传统面向对象的方式来定义和使用类。

伪代码例子(JavaScript)

class Car {constructor(brand, color) {this.brand = brand;this.color = color;this.speed = 0;}accelerate(increase) {this.speed += increase;console.log(`Current speed: ${this.speed}`);}brake(decrease) {this.speed -= decrease;if (this.speed < 0) {this.speed = 0;}console.log(`Current speed: ${this.speed}`);}
}// 创建实例
const myCar = new Car("Toyota", "Red");
myCar.accelerate(50);
myCar.brake(20);

4.2 继承和封装在 JavaScript 中

JavaScript 同样支持继承和封装。你可以使用 ​​extends​​ 关键字创建子类,并使用方法来封装属性的访问。

伪代码例子(JavaScript)

class Vehicle {constructor(brand, color) {this.brand = brand;this.color = color;}displayInfo() {console.log(`Brand: ${this.brand}`);console.log(`Color: ${this.color}`);}
}class Car extends Vehicle {constructor(brand, color) {super(brand, color);this.speed = 0;}accelerate(increase) {this.speed += increase;console.log(`Current speed: ${this.speed}`);}
}// 使用
const myCar = new Car("Honda", "Blue");
myCar.displayInfo();
myCar.accelerate(30);

4.3 封装示例

通过 JavaScript 的闭包特性,我们可以在构造函数中创建私有属性,确保这些属性不被外部直接访问。

伪代码例子(JavaScript)

function BankAccount(initialBalance) {let balance = initialBalance; // 私有属性this.deposit = function(amount) {if (amount > 0) {balance += amount;console.log(`Deposited: ${amount}`);}};this.withdraw = function(amount) {if (amount > 0 && amount <= balance) {balance -= amount;console.log(`Withdrawn: ${amount}`);} else {console.log("Insufficient funds");}};this.getBalance = function() {return balance; // 提供外部访问余额的方法};
}// 使用
const myAccount = new BankAccount(1000);
myAccount.deposit(500);
myAccount.withdraw(200);
console.log(`Current balance: ${myAccount.getBalance()}`);

​balance​​ 是一个私有变量,仅在 ​​BankAccount​​​ 的方法中可访问,确保了封装性。


基于类的面向对象编程中,类和对象是两个独立的概念。一个对象通常是一个类的实例,由该类创建。定义类的语法与实例化对象的方式(如构造函数)是不同的。而在 JavaScript 中,我们可以通过函数或对象字面量来创建对象,这意味着在 JavaScript 中不需要特定的类定义即可生成对象。这种灵活的方式相较于基于类的面向对象编程更为轻便,能够让我们更加便捷地使用对象。

虽然原型链在某种程度上看起来与继承的层级结构相似,并且在某些方面表现出类似的行为,但它们之间依然存在着显著的区别。在继承的模式中,当一个子类继承自一个父类时,子类创建的对象将同时拥有子类定义的属性及其父类(及父类的父类,依此类推)定义的属性。而在原型链中,每个层级都代表一个不同的对象,这些对象是通过 proto 属性相互链接的。可以说,原型链的行为更类似于委派(delegation)而非直接继承。委派是一种对象间的编程模式,当我们希望对象执行某个任务时,委派模式允许对象要么自己执行该任务,要么请求另一个对象(被委派的对象)以其方式来完成这个任务。这种模式相较于继承,能够在多个对象之间建立更灵活的联系,并且委派关系可以在程序运行时进行更改或完全替换。

仍然可以通过构造函数和原型实现基于类的面向对象编程特性。直接使用构造函数和原型来实现这些特性(例如继承)可能比较复杂。JavaScript 提供了一些额外的功能,这些功能在原型模型之上再抽象出一层,将基于类的面向对象编程的概念映射到原型中,从而能够更加直接地使用这些基于类的编程概念。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/885164.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mac解决 zsh: command not found: ll

Mac解决 zsh: command not found: ll 文章目录 Mac解决 zsh: command not found: ll解决方法 解决方法 1.打开bash_profile 配置文件vim ~/.bash_profile2.在文件中添加配置&#xff1a;alias llls -alF键盘按下 I 键进入编辑模式3. alias llls -alF添加完配置后&#xff0c;按…

JavaScript 变量声明

const 和 let 都是在 JavaScript ES6 中引入的变量声明方式&#xff0c;它们之间的主要区别在于 是否允许重新赋值 和 作用域。 1. 是否可以重新赋值 let&#xff1a;声明的变量可以在后续代码中被重新赋值。const&#xff1a;声明的变量不能被重新赋值。声明时必须初始化&am…

JavaAPI(1)

Java的API&#xff08;1&#xff09; 一、Math的API 是一个帮助我们进行数学计算的工具类私有化构造方法&#xff0c;所有的方法都是静态的&#xff08;可以直接通过类名.调用&#xff09; 平方根&#xff1a;Math.sqrt()立方根&#xff1a;Math.cbrt() 示例&#xff1a; p…

UI界面设计入门:打造卓越用户体验

互联网的迅猛发展催生了众多相关职业&#xff0c;其中UI界面设计师成为互联网行业的关键角色之一。UI界面设计无处不在&#xff0c;影响着网站、应用程序以及其他数字平台上的按钮、菜单布局、色彩搭配和字体排版等。UI设计不仅仅是字体、色彩和导航栏的组合&#xff0c;它的意…

python查询日志,并组装sql,修复缺失的数据

前言 由于mysql链接超时波动&#xff0c;导致数据缺失&#xff0c;需要根据日志填补数据 流程 获取确实数据的订单列表 搜索日志&#xff0c;获取请求日志 根据请求日志拼装sql 打印sql供修复数据 代码 因为我们日志打印的有问题&#xff0c;所以这里用字符串截取获取入…

利用Stable Diffusion技术,StableVision能够自动生成高质量、高分辨率的图像,满足用户对于图像素材的多样化需求。

1.产品介绍 产品介绍方案 产品名称: StableVision 图像管理分析系统 主要功能: 高精度图像生成智能分类与检索多维度数据分析定制化模板与导出功能介绍: 高精度图像生成: 具体作用:利用Stable Diffusion技术,StableVision能够自动生成高质量、高分辨率的图像,满足用户…

用户信息管理系统烟草种植用户基于SpringBootSSM框架

目录 一. 系统目标 二 需求分析 2.1 功能描述 2.1.1 用户管理 2.1.2 管理员功能 2.1.3 角色与权限管理 2.1.4 详细功能描述 2.1.5安全与权限控制功能 2.1.6系统维护与扩展功能 2.2. 非功能需求 2.3用户角色 2.4技术描述 三、数据库设计 3.1数据库需求分析 3.2数…

std::back_inserter

std::back_inserter 是 C 标准库中的一个函数模板&#xff0c;它用于创建一个插入迭代器&#xff08;insert iterator&#xff09;&#xff0c;这个迭代器可以在容器末尾插入新元素。它定义在 <iterator> 头文件中。 函数原型 template <typename Container> bac…

在 Mac 和 Windows 系统中快速部署 OceanBase

OceanBase 是一款分布式数据库&#xff0c;具备出色的性能和高扩展性&#xff0c;可以为企业用户构建稳定可靠、灵活扩展性能的数据库服务。本文以开发者们普遍熟悉的Windows 或 Mac 环境为例&#xff0c;介绍如何快速上手并体验OceanBase。 一、环境准备 1. 硬件准备 OceanB…

如何有效销售和应用低代码软件?探索其市场机会与策略

随着技术的进步&#xff0c;企业对自动化和数字化的需求日益增加。低代码开发平台应运而生&#xff0c;成为企业实现快速应用程序开发的重要工具。然而&#xff0c;在市场上推广和应用低代码软件并非易事&#xff0c;需要深入了解客户需求&#xff0c;提供定制化的解决方案&…

Docker启动gitlab后22端口被占用如何解决

文章目录 前言Docker启动参数解决方案总结 前言 这两天一直在研究Docker启动gitlab的问题&#xff0c;邮件问题暂时告一段落&#xff0c;当真正开始使用gitlab克隆的时候发现&#xff0c;之前22端口被占用无法启动&#xff0c;我就用2022端口做了一个映射&#xff0c;但是在gi…

【如何使用 ADB 脚本批量停止 Android 设备上的所有应用】

在 Android 开发和测试中,有时候我们需要批量停止设备上的所有应用进程。为此,我们可以使用一个简单的 ADB 脚本来自动完成这一任务。本文将介绍如何编写和使用这个脚本。 脚本介绍 下面的脚本通过 ADB 命令来列出并停止所有正在运行的 Android 应用进程。无需指定设备时,默…

在函数内部定义函数

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 在函数内部定义函数 在以下代码片段中&#xff0c;输出的结果是什么&#xff1f; def outer_function(x): def inner_function(y): return x y return inner_function add_five outer_func…

Go语言的接口示例

Go语言的接口(interface)是一种轻量级的多态性实现方式,是构建高扩展性、高复用性代码的利器。Go语言的接口非常灵活,不要求显式的实现声明,只要一个类型实现了接口规定的方法,它就可以被视为该接口的实现者。在本篇博客中,我们将通过多个实际示例,探讨Go语言接口的使用…

ffmpeg命令

1. 修改视频的数据速率 ffmpeg.exe -i video.mp4 -r 30 -c:v libx264 -b:v 1500k output.mp42. mp4与h264互相转换 ffmpeg.exe -i a.mp4 -vcodec h264 output.h264 ffmpeg.exe -i output.h264 -vcodec mpeg4 output.mp4

图论基础--孤岛系列

孤岛系列有&#xff1a; 孤岛总面积求解&#xff08;用了dfs、bfs两种方法&#xff09;和沉没孤岛&#xff08;这里只写了dfs一种&#xff09; 简单解释一下&#xff1a; 题目中孤岛的定义是与边缘没有任何接触的&#xff08;也就是不和二维数组的最外圈连接&#xff09;&…

LabVIEW气体检测系统

随着工业化进程的加速&#xff0c;环境污染问题愈加严峻&#xff0c;尤其是有害气体的排放对人类生存环境构成了严重威胁。为了更好地监测这些有害气体&#xff0c;开发一个高效、准确且易于操作的气体检测系统显得尤为重要。LabVIEW软件开发的气体检测系统&#xff0c;采用激光…

【Zookeeper集群搭建】安装zookeeper、zookeeper集群配置、zookeeper启动与关闭、zookeeper的shell命令操作

目录 一、安装Zookeeper 二、配置Zookeeper集群 三、Zookeeper服务的启动与关闭 四、Zookeeper的shell操作 前情提要&#xff1a;延续上篇【Hadoop和Hbase集群配置】继续配置Zookeeper&#xff0c;开启三台虚拟机Hadoop1、Hadoop2、Hadoop3&#xff0c;进入终端&#xff0c…

Shell 脚本中变量和字符串的入门介绍

以下是关于 Shell 脚本中变量和字符串的入门介绍&#xff1a; 变量 定义变量 在 Shell 脚本中&#xff0c;定义变量不需要指定类型。变量名一般以字母或下划线开头&#xff0c;不能以数字开头。例如&#xff1a; name"John" age25这里定义了两个变量 name 和 age&…

Golang | Leetcode Golang题解之第547题身份数量

题目&#xff1a; 题解&#xff1a; func findCircleNum(isConnected [][]int) (ans int) {n : len(isConnected)parent : make([]int, n)for i : range parent {parent[i] i}var find func(int) intfind func(x int) int {if parent[x] ! x {parent[x] find(parent[x])}re…