面向对象编程(Object-Oriented Programming, OOP)是编程中的一种思想和方法论,主要通过“对象”和“类”来组织代码,以提高代码的可维护性和可重用性。JavaScript 作为一种多范式编程语言,也支持面向对象编程。以下是 JavaScript 面向对象编程的基础知识:
1. 对象
对象是 JavaScript 中的基本数据结构之一。它由属性和方法组成,属性是对象的状态(数据),方法是对象的行为(函数)。
javascriptCopy code// 创建一个对象
let person = {
name: "John",
age: 30,
greet: function() {
console.log("Hello, my name is " + this.name);
}
};
// 访问对象的属性
console.log(person.name); // 输出: John
// 调用对象的方法
person.greet(); // 输出: Hello, my name is John
2. 类与构造函数
类是面向对象编程中的一个重要概念,它是对象的蓝图或模板。在 JavaScript 中,可以使用构造函数(在 ES6 之前)或 class
关键字(在 ES6 中引入)来定义类。
2.1 使用构造函数定义类
javascriptCopy codefunction Person(name, age) {
this.name = name;
this.age = age;
this.greet = function() {
console.log("Hello, my name is " + this.name);
};
}
let john = new Person("John", 30);
john.greet(); // 输出: Hello, my name is John
2.2 使用 class
关键字定义类
javascriptCopy codeclass Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
greet() {
console.log("Hello, my name is " + this.name);
}
}
let john = new Person("John", 30);
john.greet(); // 输出: Hello, my name is John
3. 继承
继承是面向对象编程中的一个核心概念,它允许一个类(子类)继承另一个类(父类)的属性和方法。
javascriptCopy codeclass Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(this.name + " makes a sound.");
}
}
class Dog extends Animal {
constructor(name, breed) {
super(name); // 调用父类的构造函数
this.breed = breed;
}
speak() {
console.log(this.name + " barks.");
}
}
let dog = new Dog("Buddy", "Golden Retriever");
dog.speak(); // 输出: Buddy barks.
4. 多态
多态是指在父类中定义的某些方法可以在子类中有不同的实现。
javascriptCopy codeclass Animal {
speak() {
console.log("Animal makes a sound.");
}
}
class Dog extends Animal {
speak() {
console.log("Dog barks.");
}
}
class Cat extends Animal {
speak() {
console.log("Cat meows.");
}
}
let animals = [new Dog(), new Cat()];
animals.forEach(animal => {
animal.speak(); // Dog barks. Cat meows.
});
5. 封装
封装是指将对象的属性和方法限制在对象内部,外部代码不能直接访问或修改对象的内部状态。这通常通过将属性设为私有,并提供公共方法来访问这些属性来实现。
在 JavaScript 中,可以通过使用 #
符号(ES6 私有字段)或闭包来实现封装。
5.1 使用 #
符号实现封装
javascriptCopy codeclass Person {
#name; // 私有属性
constructor(name) {
this.#name = name;
}
getName() {
return this.#name;
}
}
let person = new Person("John");
console.log(person.getName()); // 输出: John
console.log(person.#name); // 报错: SyntaxError: Private field '#name' must be declared in an enclosing class
面向对象编程通过“类”和“对象”来组织代码,使得代码更具模块化、可重用性和可维护性。掌握对象、类、继承、多态和封装这些基本概念是深入理解面向对象编程的关键。