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

深入理解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日

相关文章

  • C语言实现猜数字游戏的两种方法

    让我来详细讲解一下如何通过C语言实现猜数字游戏的两种方法。 1. 第一种方法:使用随机数 1.1 实现思路 使用随机数实现猜数字游戏的流程如下: 程序随机生成一个数字; 用户输入一个数进行猜测; 程序根据用户猜测的数,判断是大、小还是等于随机数; 如果猜对了,输出提示信息并结束程序;如果猜错了,输出提示信息并继续猜。 1.2 代码示例 下面是使用随机数实现猜…

    C 2023年5月23日
    00
  • PyPy 如何让Python代码运行得和C一样快

    PyPy(Python运行时编译器)是一个替代CPython(官方Python解释器)的选择。它通过JIT(即时编译)技术不断优化代码,使得Python执行速度与C语言一样快。攻略如下: 步骤1:安装PyPy 在PyPy的官方网站上下载与您的操作系统相关的二进制文件。然后解压缩文件,将可执行文件添加到您的系统环境变量。 步骤2:运行PyPy PyPy提供了一…

    C 2023年5月23日
    00
  • Recommended C Style and Coding Standards中文翻译版

    首先,需要明确“Recommended C Style and Coding Standards”是一份由美国国防部发布的规范文档,旨在规范C语言程序的编写。该文档包含了C语言编程所需的规范、风格、注释、命名、代码布局和格式等方面的建议。如何应用该文档,建立自己的编程风格呢? 以下是应用“Recommended C Style and Coding Stan…

    C 2023年5月22日
    00
  • Win11更新失败并提示0xc1900101怎么办?Win11错误提示0xc1900101解决方法

    Win11更新失败并提示0xc1900101是一个常见的问题,它可能发生在更新到Windows 11时。这个错误代码可能是由于硬件与软件不兼容、设备驱动程序不正确、磁盘空间不足以及许多其他原因引起的。下面我们来详细讲解Win11更新失败并提示0xc1900101该如何解决。 检查计算机硬件与设备 在更新之前,必须检查计算机的硬件是否与Windows 11兼容…

    C 2023年5月23日
    00
  • C++STL教程之vector模板的使用

    C++STL教程之vector模板的使用 什么是vector? vector是C++标准库中的一种容器,可以看作是包含一组元素的动态数组。与C-style数组相比,vector有许多好处: 可以动态调整数组大小,无需手动分配内存 便于元素的插入和删除操作 支持自动内存管理,避免内存泄漏等问题 在使用vector之前,需要引入头文件 #include<v…

    C 2023年5月23日
    00
  • vc控制台程序关闭事件时的处理方式及注意点详解

    VC控制台程序关闭事件时的处理方式及注意点详解 背景 在开发 VC 控制台程序时,我们需要考虑程序关闭事件的处理方式及注意事项。在程序关闭时,需要完成一些清理工作,避免导致内存泄漏等问题。本文将详细讲解 VC 控制台程序关闭事件的处理方式及注意点。 程序关闭事件 VC 控制台程序关闭事件主要包括以下几种: 用户手动关闭程序 系统发生错误导致的程序退出 外部信…

    C 2023年5月30日
    00
  • linux下基于C语言的信号编程实例

    下面我将为你详细讲解“linux下基于C语言的信号编程实例”的完整攻略。 概述 在linux系统中,信号机制是进程间通信的一种方式,它能够及时地通知进程事件的发生,从而使得进程能够立即做出响应。C语言提供了一系列的信号处理函数,可以用来处理不同种类的信号。在本攻略中,我们将实现两个基于信号机制的C语言程序,分别是捕获Ctrl+C信号和定时器信号。 程序一:捕…

    C 2023年5月22日
    00
  • C语言必背的一些经典程序代码实例

    下面是关于“C语言必背的一些经典程序代码实例”的详细攻略。 一、为什么要学习经典程序代码实例 首先,要了解为什么要学习经典程序代码实例。经典程序代码实例是经过大量实践、考验的优秀程序代码,不仅可以让我们了解基本的编程思路和实现方法,同时也可以拓展我们的编程思维,提高我们的编程能力。 二、经典程序代码实例的分类 常见的经典程序代码实例可以分为以下几类: 算法:…

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