【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 提供了一些额外的功能,这些功能在原型模型之上再抽象出一层,将基于类的面向对象编程的概念映射到原型中,从而能够更加直接地使用这些基于类的编程概念。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++入门基础知识142—【关于C++ 友元函数】

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C 友元函数的相关内容&#xff01; 关于…

BO-CNN-LSTM回归预测 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络多输入单输出回归预测

BO-CNN-LSTM回归预测 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络多输入单输出回归预测 目录 BO-CNN-LSTM回归预测 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络多输入单输出回归预测效果一览基本介绍模型搭建程序设计参考资料 效果一览 …

vue实现图片无限滚动播放

本人vue新手菜鸡&#xff0c;文章为自己在项目中遇到问题的记录&#xff0c;如有不足还请大佬指正 文章目录 实现效果代码展示总结 因为刚接触vue&#xff0c;本想着看看能不能用一些element的组件实现图片的轮播效果&#xff0c;尝试使用过element-UI里的走马灯Carouse&#x…

python画图|灵活的subplot_mosaic()函数-初逢

【1】引言 前述学习进程中&#xff0c;对hist()函数画直方图已经有一定的探索。然而学无止境&#xff0c;在继续学习的进程中&#xff0c;我发现了一个显得函数subplot_mosaic()&#xff0c;它几乎支持我们随心所欲地排布多个子图。 经过自我探索&#xff0c;我有一些收获&am…

ODOO学习笔记(1):ODOO的SWOT分析和技术优势是什么?

ODOO是一款开源的企业管理软件套件&#xff0c;广泛应用于企业管理中。它由比利时的Odoo S.A.公司开发&#xff0c;最初名为OpenERP&#xff0c;现在已经成为全球流行的ERP解决方案之一。ODOO集成了ERP、CRM、电子商务和CMS等多种功能模块&#xff0c;适用于各种规模的企业应用…

淘酒屋殷卓荣窖主高端客户私享答谢晚宴暨意大利摩罗斯酒庄之夜

一边是热爱&#xff0c;一边是事业&#xff0c;鱼与熊掌兼得淘酒屋殷卓荣窖主答谢晚宴圆满结束 淘酒屋殷卓荣窖主高端 VIP 客户私享答谢晚宴暨意大利摩罗斯酒庄品鉴之夜在广州四季酒店 99 楼圆满举办 2024 年 11 月 8 日晚&#xff0c;一场别开生面的淘酒屋殷卓荣窖主高端 VI…

LeetCode热题100之贪心算法

1.买卖股票的最佳时机 思路分析&#xff1a;即需要找出某一天的最低价格和它后面几天的最高价格差。 维护一个变量min_price&#xff0c;表示到目前为止遇到的最低股票价格&#xff1b;遍历prices数组&#xff0c;在每一天的价格上&#xff1a; 更新min_price为当前的价格和mi…

SL6115降压恒流 60V降压恒流芯片,高精度1%,PWM模拟调光

一、核心参数与性能 工作电压范围&#xff1a;5.5V至60V&#xff0c;宽输入电压范围使其能够适应多种应用场景。 最大输出电流&#xff1a;根据公开发布的信息&#xff0c;SL6115的最大输出电流可达到1.2A至1.5A&#xff0c;具体取决于不同版本或制造商的规格说明。这一高输出…

测试概念以及测试bug

关于测试的概念 什么是需求&#xff1f; 需求分为用户需求和软件需求。 软件需求可以作为开发和测试工作的依据&#xff0c;而用户需求不一定是合理的&#xff0c;这里的不合理有很多的角度&#xff1a;技术角度上&#xff0c;市场需求上&#xff0c;投入成本和收益比噔噔。…

【青牛科技】GC5931:工业风扇驱动芯片的卓越替代者

在工业领域&#xff0c;工业风扇的稳定高效运行对于维持良好的生产环境至关重要。而驱动芯片作为工业风扇控制系统的核心元件&#xff0c;其性能直接影响风扇的工作状态。芯麦 GC5931 作为一款新型驱动芯片&#xff0c;在替代 A5931/Allegro 应用于工业风扇中展现出了非凡的优势…

阿里云docker安装禅道记录

docker network ls docker network create -d bridge cl_network sudo docker run --name zentao --restart always -p 9982:80 --networkcl_network -v /data/zentao:/data -e MYSQL_INTERNALtrue -d hub.zentao.net/app/zentao:18.5 升级禅道 推荐用按照此文档升级&a…

艾体宝产品丨加速开发!Redis Copilot智能助手上线

我们最近发布了 Redis Copilot&#xff0c;旨在帮助开发者更加高效地使用 Redis 构建应用。提升应用性能&#xff0c;简化构建过程是我们不懈的追求。Redis Copilot 正是为此而生的人工智能助手&#xff0c;助力开发者迅速掌握 Redis 的使用技巧。现在您可以在 Redis Insight 中…

深度学习入门:梯度消失问题浅谈(Sigmod,ReLu)

Sigmoid的梯度消失 以下是一个通过简单的神经网络示例来解释 Sigmoid 函数的梯度消失问题。 假设有一个非常简单的三层神经网络&#xff0c;输入层有两个神经元&#xff0c;隐藏层有两个神经元&#xff0c;输出层有一个神经元。我们使用均方误差作为损失函数&#xff0c;并且…

Chromium127编译指南 Linux篇 - 额外环境配置(五)

引言 在成功获取 Chromium 源代码后&#xff0c;接下来我们需要配置适当的编译环境&#xff0c;以便顺利完成开发工作。本文将详细介绍如何设置 Python 和相关的开发工具&#xff0c;以确保编译过程无碍进行。这些配置步骤是开发 Chromium 的必要准备&#xff0c;确保环境设置…

批量混剪矩阵发布助力短视频营销快速获客

内容概要 在现代营销环境中&#xff0c;短视频已经成为品牌传播的重要工具&#xff0c;尤其是在获取潜在客户方面&#xff0c;短视频营销展现出了卓越的效率。那么&#xff0c;为什么要做短视频营销呢&#xff1f;首先&#xff0c;短视频能够迅速抓住观众的注意力&#xff0c;…

uni-app小程序echarts中tooltip被遮盖

图表中的文案过长&#xff0c;tooltip溢出容器&#xff0c;会被遮盖住 解决方案&#xff1a; 在echarts的tooltip中有confine属性可将tooltip限制在容器内&#xff0c;不超过容器&#xff0c;就不易被遮盖

怎么把图片快速压缩变小?图片在线压缩的3款简单工具

随着互联网的快速发展&#xff0c;将图片上传到网上平台来展示是很常用的一种方式&#xff0c;但是现在图片质量越来越高&#xff0c;导致图片也比较大&#xff0c;经常会出现无法上传的情况。那么在遇到这个问题时&#xff0c;通过图片压缩功能来处理图片会比较简单。本文给大…

科学计算服务器:如何计算算力?如何提升科学研究效率?

在现代科学研究的舞台上&#xff0c;科学计算服务器犹如一位强大的幕后英雄&#xff0c;为复杂科学计算任务的攻克提供着坚实支撑。准确计算其算力并充分发挥优势&#xff0c;对提升科学研究效率意义非凡。 服务器的中央处理器&#xff08;CPU&#xff09;计算力。在科学计算服…

【MRAN】情感分析中情态缺失问题的多模态重构和对齐网络

abstract 多模态情感分析&#xff08;MSA&#xff09;旨在通过文本、视觉和声音线索识别情感类别。然而&#xff0c;在现实生活中&#xff0c;由于各种原因&#xff0c;可能会缺少一到两种模式。当文本情态缺失时&#xff0c;由于文本情态比视觉和听觉情态包含更多的语义信息&…

Kafka生产者如何提高吞吐量?

1、batch.size&#xff1a;批次大小&#xff0c;默认16k 2、linger.ms&#xff1a;等待时间&#xff0c;修改为5-100ms 3、compression.type&#xff1a;压缩snappy 4、 RecordAccumulator&#xff1a;缓冲区大小&#xff0c;修改为64m 测试代码&#xff1a; package com.bigd…