返回

初探JS OOP的世界:对象、类和封装的魅力

前端

邂逅 JavaScript 中面向对象编程:破解 OOP 的奥秘

对象:万物皆对象

踏入 JavaScript 的世界,映入眼帘的是一个奇妙的景象,在这里,一切都以对象的形式存在。数字、字符串、数组,甚至函数,无一例外。对象宛如数据世界的容器,存储着属性(特征)和方法(行为)。

const person = {
  name: "John Doe",
  age: 30,
  greet: function() {
    console.log("Hello, my name is " + this.name);
  }
};

在这个例子中,person 是一个对象,其属性包括姓名和年龄,而方法 greet 负责向我们打招呼。

类:对象的蓝图

类是对象的蓝图,它定义了对象的结构和行为。通过类,我们可以批量创建具有相同属性和方法的对象。

class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  greet() {
    console.log("Hello, my name is " + this.name);
  }
}

const john = new Person("John Doe", 30);
const jane = new Person("Jane Doe", 25);

john.greet(); // Hello, my name is John Doe
jane.greet(); // Hello, my name is Jane Doe

在这里,Person 是一个类,其构造函数定义了对象的属性,而 greet 方法则定义了对象的行为。通过使用 new ,我们创建了两个新的对象 johnjane

封装:私密数据的守护神

封装是一个保护神,守护着对象私密数据不被外界窥探。在 JavaScript 中,我们可以使用 private 关键字实现封装。

class Person {
  #name;
  #age;

  constructor(name, age) {
    this.#name = name;
    this.#age = age;
  }

  greet() {
    console.log("Hello, my name is " + this.#name);
  }
}

const john = new Person("John Doe", 30);
john.greet(); // Hello, my name is John Doe

// 无法访问私有属性
console.log(john.#name); // error

在此示例中,我们使用 #name#age 声明了私有属性。私有属性只能在类的内部访问,外部无法窥见。

继承:血脉相承的艺术

继承是一种血脉传承的艺术,它允许一个类从另一个类继承属性和方法。子类不仅继承了父类的特征,还可以在此基础上进行扩展和修改。

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

  work() {
    console.log("I'm working hard!");
  }
}

const employee = new Employee("John Doe", 30, 10000);
employee.greet(); // Hello, my name is John Doe
employee.work(); // I'm working hard!

在该示例中,Employee 类继承了 Person 类。Employee 类拥有 Person 类的所有属性和方法,同时新增了一个 salary 属性和一个 work 方法。

多态:千姿百态的展现

多态是一种千变万化的艺术形式,它允许子类以不同的方式实现父类的方法。当一个父类的方法被子类覆盖时,就会发生多态。

class Animal {
  speak() {
    console.log("I'm an animal.");
  }
}

class Dog extends Animal {
  speak() {
    console.log("Woof!");
  }
}

class Cat extends Animal {
  speak() {
    console.log("Meow!");
  }
}

const dog = new Dog();
const cat = new Cat();

dog.speak(); // Woof!
cat.speak(); // Meow!

在这个例子中,Dog 类和 Cat 类都继承了 Animal 类。当我们调用 speak 方法时,不同的子类会以不同的方式实现这个方法。

结语

面向对象编程是 JavaScript 中一件利器,它能助我们打造更易理解、维护和重用的代码。通过理解对象、类、封装、继承和多态的概念,我们可以轻松驾驭 JavaScript,挥洒出优雅的代码。

常见问题解答

  1. 什么是对象?
    对象是数据世界的容器,存储着属性(特征)和方法(行为)。

  2. 类和对象有什么区别?
    类是对象的蓝图,定义了对象的结构和行为。对象则是类创建的具体实例。

  3. 封装有什么作用?
    封装保护私密数据不被外界窥探,提高代码安全性。

  4. 继承允许做什么?
    继承允许子类从父类继承属性和方法,在父类的基础上进行扩展和修改。

  5. 多态是如何实现的?
    当一个父类的方法被子类覆盖时,就会发生多态,允许子类以不同的方式实现父类的方法。