返回

最全面的JavaScript面向对象指南

前端

JavaScript中的面向对象编程
JavaScript中没有传统意义上的类和对象,而是基于原型的面向对象编程。这意味着对象可以从其他对象继承属性和方法,并且可以动态地创建和修改对象。

原型

原型是JavaScript中对象的一个特殊属性,它指向创建该对象的构造函数。每个对象都有一个原型,并且可以通过原型访问构造函数的属性和方法。

构造函数

构造函数是用来创建对象的函数。构造函数的名称通常以大写字母开头,并且在调用时使用new。

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

上面的代码定义了一个构造函数Person,它有两个参数:name和age。当使用new关键字调用Person构造函数时,会创建一个新的对象,并把构造函数的参数作为对象的属性。

const person1 = new Person("John", 30);
console.log(person1.name); // John
console.log(person1.age); // 30

上面的代码创建了一个新的Person对象,并把"John"和30作为对象的属性。然后,使用console.log()方法输出对象的属性值。

类是JavaScript中的一种语法糖,它可以让你用更简洁的方式定义对象。类的语法如下:

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

上面的代码定义了一个类Person,它有两个属性:name和age。类的构造函数是使用constructor关键字定义的,它在创建对象时被调用。

const person1 = new Person("John", 30);
console.log(person1.name); // John
console.log(person1.age); // 30

上面的代码创建了一个新的Person对象,并把"John"和30作为对象的属性。然后,使用console.log()方法输出对象的属性值。

继承

继承是指一个对象可以从另一个对象继承属性和方法。在JavaScript中,可以使用extends关键字实现继承。

class Student extends Person {
  constructor(name, age, grade) {
    super(name, age);
    this.grade = grade;
  }
}

上面的代码定义了一个类Student,它继承了Person类。Student类有两个属性:name和age,它们是从Person类继承来的。Student类还定义了一个新的属性grade。

const student1 = new Student("John", 30, "A");
console.log(student1.name); // John
console.log(student1.age); // 30
console.log(student1.grade); // A

上面的代码创建了一个新的Student对象,并把"John"、30和"A"作为对象的属性。然后,使用console.log()方法输出对象的属性值。

多态

多态是指对象可以根据自己的类型执行不同的操作。在JavaScript中,可以使用多态来实现代码的重用。

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

class Student extends Person {
  constructor(name, grade) {
    super(name);
    this.grade = grade;
  }
  greet() {
    super.greet();
    console.log(`I'm a student in grade ${this.grade}`);
  }
}

const person1 = new Person("John");
const student1 = new Student("John", "A");

person1.greet(); // Hello, my name is John
student1.greet(); // Hello, my name is John
// I'm a student in grade A

上面的代码定义了两个类:Person和Student。Person类定义了一个名为greet()的方法,该方法输出"Hello, my name is "加上对象的名称。Student类继承了Person类,并重写了greet()方法。Student类的greet()方法调用了父类的greet()方法,然后输出"I'm a student in grade "加上对象的年级。

const people = [person1, student1];

for (const person of people) {
  person.greet();
}

上面的代码创建了一个数组people,其中包含person1和student1对象。然后,使用for-of循环遍历数组people,并调用每个对象的greet()方法。由于person1是一个Person对象,而student1是一个Student对象,因此greet()方法的输出不同。

封装

封装是指将对象的属性和方法隐藏起来,只允许通过对象的公开方法来访问它们。在JavaScript中,可以使用访问控制符来实现封装。

class Person {
  #name;
  #age;

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

  getName() {
    return this.#name;
  }

  getAge() {
    return this.#age;
  }
}

上面的代码定义了一个类Person,它有两个私有属性:#name和#age。私有属性只能通过对象的公开方法来访问。

const person1 = new Person("John", 30);

console.log(person1.#name); // Error: Cannot access private field #name on object of type Person
console.log(person1.#age); // Error: Cannot access private field #age on object of type Person

console.log(person1.getName()); // John
console.log(person1.getAge()); // 30

上面的代码创建了一个新的Person对象,并把"John"和30作为对象的属性。然后,使用console.log()方法输出对象的属性值。由于#name和#age是私有属性,因此无法直接访问它们。只能通过对象的公开方法getName()和getAge()来访问它们。

总结

本文介绍了JavaScript中的面向对象编程,包括原型、构造函数、类、继承、多态和封装等概念。希望本文能帮助您理解JavaScript中面向对象编程的核心概念和技巧,从而编写出更易维护、更具可扩展性的代码。