深入理解JavaScript系列(17):面向对象编程之概论详细介绍

yizhihongxing

深入理解JavaScript系列(17):面向对象编程之概论详细介绍

前言

本文是深入理解JavaScript系列的第17篇,讲解面向对象编程的概念、理论和实践。在JavaScript中,我们可以使用面向对象编程(Object-Oriented Programming,OOP)的方式,构建更灵活、可维护性更好的代码。

什么是面向对象编程?

面向对象编程是一种编程范式,它将程序分解成多个独立的对象,每个对象都是具有属性和方法的独立实体,这些对象之间可以进行交互、传递消息,从而实现程序的功能。对象一般由类(Class)定义,类是对象的模板,它定义了对象的属性和方法。

面向对象编程有三个基本特征:

  1. 封装(Encapsulation):将对象的属性和方法封装在一起,对外暴露的只是一个接口,这样外部代码无法直接操作对象的内部状态,从而保证对象的安全性和稳定性。
  2. 继承(Inheritance):可以通过继承实现代码重用,将共同的代码抽象到一个父类中,子类可以继承父类的属性和方法,同时可以重写和扩展父类的行为。
  3. 多态(Polymorphism):允许不同的对象对同一个方法作出不同的响应。

面向对象编程的实现方式

1. 原型式继承

JavaScript是基于原型的语言,对象可以通过原型的方式继承其他对象的属性和方法。例如:

var Parent = function(name) {
  this.name = name;
};

Parent.prototype.sayHello = function() {
  console.log('Hello, I am ' + this.name);
};

var Child = function(name, age) {
  Parent.call(this, name); // 继承父类的name属性
  this.age = age;
};

Child.prototype = new Parent(); // 设置原型为父类实例

Child.prototype.sayHello = function() {
  console.log('Hello, I am ' + this.name + ', age ' + this.age); // 重写父类的sayHello方法
};

var child = new Child('Tom', 7);
child.sayHello();

在这个例子中,我们用 Child 继承了 Parent 的 name 属性,同时也通过原型的方式继承了 Parent 的 sayHello 方法。我们还重写了 Child 的 sayHello 方法,由于多态的特性,当我们调用 Child 实例的 sayHello 方法时,会调用 Child 的定义,而不是 Parent 的定义。

2. 类式继承

在 ES6 中,JavaScript 引入了类的概念。使用类式继承,可以更加清晰地表达类与类之间的继承关系,实现起来也更加直观。例如:

class Parent {
  constructor(name) {
    this.name = name;
  }

  sayHello() {
    console.log('Hello, I am ' + this.name);
  }
}

class Child extends Parent {
  constructor(name, age) {
    super(name); // 调用父类的构造函数
    this.age = age;
  }

  sayHello() {
    console.log('Hello, I am ' + this.name + ', age ' + this.age);
  }
}

let child = new Child('Tom', 7);
child.sayHello();

我们可以看到,在类式继承中,用 class 定义了一个类,其中使用 extends 关键字继承了父类,使用 super 调用了父类的构造函数。在子类中重写了 sayHello 方法,实现了对父类方法的覆盖。

总结

面向对象编程是一种重要的编程范式,在 JavaScript 中,我们可以使用原型式继承、类式继承等方式实现面向对象编程。学习和使用OOP可以让我们更好地组织和管理代码,提高开发效率和代码质量。

示例1:游戏角色设计

通过面向对象编程的方法,我们可以设计出一个游戏角色的类,包括名称、生命值、攻击力和技能等属性和方法。例如:

class Character {
  constructor(name) {
    this.name = name;
    this.maxHp = 100;
    this.hp = 100;
    this.atk = 10;
  }

  sayHello() {
    console.log('Hello, I am ' + this.name);
  }

  attack(enemy) {
    console.log(this.name + ' attacks ' + enemy.name + ', ' + this.atk + ' damage caused');
    enemy.hurt(this.atk);
  }

  skill(enemy) {
    console.log(this.name + ' uses skill on ' + enemy.name + ', ' + this.atk*2 + ' damage caused');
    enemy.hurt(this.atk*2);
  }

  hurt(damage) {
    console.log(this.name + ' is hurt, ' + damage + ' damage taken');
    this.hp -= damage;
    if (this.hp <= 0) {
      console.log(this.name + ' is dead');
    }
  }
}

let player = new Character('阿达');
let enemy = new Character('兽人');

player.sayHello();
enemy.sayHello();

player.attack(enemy);
enemy.attack(player);
player.skill(enemy);

在这个例子中,我们通过类的方式定义了一个游戏角色 Character,其中包括了 sayHelloattackskillhurt 等属性和方法。我们还在构造函数中初始化了角色的生命值、攻击力等属性。在 attackskillhurt 方法中,我们还使用了多态,让不同的角色对同一个方法作出不同的响应。

示例2:购物车设计

再举一个例子,假如我们正在设计一个购物车系统,需要支持添加、删除、修改和计算总价等操作。我们可以用面向对象编程的方法,设计一个购物车的类。例如:

class Cart {

  constructor() {
    this.items = [];
  }

  add(item) {
    this.items.push(item);
    console.log(item.name + ' added to cart');
  }

  remove(item) {
    const index = this.items.findIndex(x => x.name === item.name);
    if (index > -1) {
      this.items.splice(index, 1);
      console.log(item.name + ' removed from cart');
    }
  }

  update(item, newQuantity) {
    const index = this.items.findIndex(x => x.name === item.name);
    if (index > -1) {
      const oldQuantity = this.items[index].quantity;
      this.items[index].quantity = newQuantity;
      console.log(item.name + ' quantity updated from ' + oldQuantity + ' to ' + newQuantity);
    }
  }

  getTotalPrice() {
    let totalPrice = 0;
    for (let item of this.items) {
      totalPrice += item.price * item.quantity;
    }
    console.log('Total price: ' + totalPrice);
  }

}

let cart = new Cart();

let apple = {
  name: 'Apple',
  price: 5,
  quantity: 1
};

let banana = {
  name: 'Banana',
  price: 7,
  quantity: 2
};

cart.add(apple);
cart.add(banana);
cart.getTotalPrice();

cart.remove(banana);
cart.update(apple, 3);
cart.getTotalPrice();

在这个例子中,我们通过类的方式定义了一个购物车类 Cart,其中包括了 addremoveupdategetTotalPrice 等属性和方法。在 totalPrice 中,我们还使用了循环和累加的方法,计算出购物车中所有商品的总价。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入理解JavaScript系列(17):面向对象编程之概论详细介绍 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • 对python中Json与object转化的方法详解

    下面是“对Python中Json与Object转化的方法详解”的完整攻略。 1. Json与Object转化的背景 在Python中,常常需要处理Json数据以及Json字符串与Python对象之间的转化。在实际开发中,我们通常会使用如下的数据格式: { "name": "张三", "age": 1…

    C 2023年5月23日
    00
  • golang常用加密解密算法总结(AES、DES、RSA、Sha1、MD5)

    Golang常用加密解密算法总结 Golang提供了丰富的加密解密算法库,本篇文章将介绍常用的加密解密算法:AES、DES、RSA、Sha1、MD5。 AES(Advanced Encryption Standard) AES加密算法是目前应用最广泛的对称加密算法,在网络传输中常作为对称加密方式使用。AES算法支持多种不同的密钥长度,包括128位,192位和…

    C 2023年5月23日
    00
  • Shell脚本实现C语言代码行数统计

    我们来详细讲解一下“Shell脚本实现C语言代码行数统计”的完整攻略。 1. Shell脚本实现C语言代码行数统计的思路 我们知道,C语言是一种编译型语言,编译后的代码是二进制可执行文件。想要统计C语言代码行数,我们需要将源代码文件解析成文本文件,然后使用Shell脚本进行行数统计。 具体步骤如下: 使用find命令查找指定目录下的所有.c和.h文件,并将文…

    C 2023年5月24日
    00
  • 如何查看Win10笔记本电池状况及电量详细报告?

    下面是详细讲解如何查看Win10笔记本电池状况及电量详细报告的攻略: 1. 查看电池状况 Windows 10提供了自带的电池健康报告工具,使用方法如下: 1.1. 打开”Windows PowerShell”命令行工具 可以通过在任务栏搜索栏中输入”PowerShell”,并点击”Windows PowerShell”应用程序来打开该命令行工具。 1.2.…

    C 2023年5月23日
    00
  • 实例分享cmake编译一个简单c++项目(demo)

    作为网站作者,我很乐意为大家详细讲解如何使用CMake编译一个简单的C++项目。在本文中,我将为您提供一些步骤,以帮助您了解如何使用CMake生成可执行文件、静态库或共享库。我们将会涉及以下几个方面: 概述 安装CMake 创建C++项目 编写CMakeLists.txt 配置并生成项目 示例说明 总结 1. 概述 CMake是一个跨平台的、开源的构建工具,…

    C 2023年5月23日
    00
  • C程序 检查两个矩阵是否相等

    下面我将详细讲解如何使用“C程序 检查两个矩阵是否相等”。 什么是“C程序 检查两个矩阵是否相等” “C程序 检查两个矩阵是否相等”是一段使用C语言编写的程序,可以用来检查两个矩阵是否相等。它可以判断两个矩阵是否具有相同的行列数,并逐一比较矩阵中的每一个元素,以判断两个矩阵是否相等。 如何使用“C程序 检查两个矩阵是否相等” 要使用“C程序 检查两个矩阵是否…

    C 2023年5月9日
    00
  • 获取当前系统本地时间,精确到毫秒的实例

    获取当前系统本地时间,精确到毫秒的实例可以使用JavaScript中的Date对象,通过获取当前时间毫秒数的方式来实现。 以下是获取当前时间毫秒数的代码示例: const now = new Date(); const ms = now.getTime(); // 获取当前时间毫秒数 console.log(ms); // 输出当前时间毫秒数 此外,还有一种…

    C 2023年5月23日
    00
  • win7系统打开程序提示应用程序正常初始化0xc0000142失败的原因及解决方法

    win7系统打开程序提示应用程序正常初始化0xc0000142失败的原因及解决方法 问题描述 在使用Windows 7系统时,打开应用程序时会出现提示“应用程序无法启动,应用程序无法正常初始化(0xc0000142)。单击确认关闭应用程序。”的错误提示。 原因分析 0xc0000142错误通常指的是程序无法正常初始化,可能由于以下原因导致: 应用程序的关键文…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部