返回

从数据结构到原型链:架构思维的进化之路

前端

数据结构是计算机科学的基石,为我们提供了组织和存储数据的有效方法。链表、栈和队列是最基本的线性数据结构,具有不同的特性和应用场景。理解这些数据结构是构建复杂系统和高效算法的基础。

链表是一种动态数据结构,其元素以节点的形式连接在一起,每个节点都包含数据和指向下一个节点的链接。链表可以插入和删除元素,同时保持顺序性。链表常用于实现链表、队列和散列表等数据结构。

栈是一种后进先出(LIFO)的数据结构,其元素按后进先出的顺序存储。栈通常用于函数调用、递归和括号匹配等场景。

队列是一种先进先出(FIFO)的数据结构,其元素按先进先出的顺序存储。队列通常用于任务调度、消息传递和缓冲等场景。

了解这些基础数据结构后,原型链将成为我们构建清晰架构思维的下一站。原型链是JavaScript中的一种特殊机制,它允许对象继承其他对象的属性和方法。原型链使我们能够创建可复用的代码,并理解作用域链和闭包等高级概念。

作用域链定义了变量和函数的可见性范围,它决定了哪些代码块可以访问特定的变量或函数。作用域链从当前作用域开始,向上逐层查找,直到找到包含所需变量或函数的作用域。

闭包是JavaScript中的一个重要概念,它允许函数访问其创建时的变量,即使该函数已经执行完毕。闭包使我们能够创建私有变量和方法,并实现状态管理和事件处理等功能。

从链表、栈、队列到原型链、作用域链和闭包,这条架构思维的进化之路为我们提供了构建复杂系统和有效算法的基础。通过理解这些概念,我们能够提升我们的代码质量,并应对日益增长的技术挑战。

实例 1:使用链表实现队列

class Node {
  constructor(data) {
    this.data = data;
    this.next = null;
  }
}

class Queue {
  constructor() {
    this.head = null;
    this.tail = null;
  }

  enqueue(data) {
    const newNode = new Node(data);
    if (this.tail === null) {
      this.head = newNode;
      this.tail = newNode;
    } else {
      this.tail.next = newNode;
      this.tail = newNode;
    }
  }

  dequeue() {
    if (this.head === null) {
      throw new Error("Queue is empty");
    } else {
      const data = this.head.data;
      this.head = this.head.next;
      if (this.head === null) {
        this.tail = null;
      }
      return data;
    }
  }
}

实例 2:使用原型链实现继承

function Person(name) {
  this.name = name;
}

Person.prototype.greet = function() {
  console.log(`Hello, my name is ${this.name}`);
}

function Student(name, major) {
  Person.call(this, name);
  this.major = major;
}

Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student;

Student.prototype.study = function() {
  console.log(`I'm studying ${this.major}`);
}

const john = new Student("John", "Computer Science");
john.greet(); // Hello, my name is John
john.study(); // I'm studying Computer Science