1. JavaScript面向对象编程概述
对于初学者来说,理解面向对象编程(Object Oriented Programming,OOP)可能会有些困难。简单来说,OOP是一种思想、方法,把现实世界中的事物抽象成一个个对象,每个对象都有自己的属性和方法,用这个对象来描述现实世界的一个实体,就像我们生活中的汽车、手机等等。
在JavaScript中,也可以使用OOP的思想来编程。JavaScript中的对象是由属性和方法组成的。属性就是某个对象所拥有的数据或信息,而方法则是某个对象所能够执行的操作。
下面我将介绍如何在JavaScript中使用面向对象编程。
2. 创建对象
在JavaScript中,有两种创建对象的方式:工厂函数和构造函数。
2.1 工厂函数创建对象
工厂函数其实就是一个普通函数,用来创建对象。在函数中创建一个空对象,然后为这个对象添加属性和方法,最后将这个对象返回即可。
function createCar(brand, model, price) {
let car = {};
car.brand = brand;
car.model = model;
car.price = price;
car.getInfo = function() {
return 'Brand: ' + this.brand + ', Model: ' + this.model + ', Price: ' + this.price;
}
return car;
}
let myCar = createCar('BMW', 'M3', 1000000);
console.log(myCar.getInfo()); // Brand: BMW, Model: M3, Price: 1000000
在上面的代码中,我们定义了一个createCar()
函数来创建汽车对象。首先,我们创建了一个空对象car
,并为其添加三个属性:品牌(brand
)、型号(model
)和价格(price
)。然后,我们添加了一个getInfo()
方法,该方法可以返回该对象的属性值。最后我们返回了这个对象。
2.2 构造函数创建对象
构造函数是一种特殊的函数,它使用new
关键字来创建对象。在函数内部,可以使用this
关键字来引用新创建的对象,然后为这个新对象添加属性和方法。
function Car(brand, model, price) {
this.brand = brand;
this.model = model;
this.price = price;
this.getInfo = function() {
return 'Brand: ' + this.brand + ', Model: ' + this.model + ', Price: ' + this.price;
};
}
let myCar = new Car('BMW', 'M3', 1000000);
console.log(myCar.getInfo()); // Brand: BMW, Model: M3, Price: 1000000
在上面的代码中,我们定义了一个Car()
构造函数来创建汽车对象。在函数内部,我们使用this
关键字来引用新创建的对象,并为其添加属性和方法。最后,我们使用new
关键字来创建一个新的Car
对象,并将其赋值给myCar
变量。
3. 继承
继承是面向对象编程中的一个重要概念。它允许创建一个新的类,该类从已有的类中继承属性和方法,从而避免了重复编写代码的问题。
3.1 原型继承
在JavaScript中,有一种叫做原型继承的方法。每个JavaScript对象都有一个原型,它保持着一个到另一个对象的引用。当查找一个对象的属性时,如果这个对象本身没有这个属性,那么会去它的原型(即它的父对象)中查找,如果还没有找到,就会继续查找原型对象的原型,直到最后到达Object.prototype这个原型对象为止。
function Person(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
}
Person.prototype.getInfo = function() {
return 'Name: ' + this.name + ', Age: ' + this.age + ', Job: ' + this.job;
};
function Student(name, age, job, grade) {
this.grade = grade;
Person.call(this, name, age, job); // 实现属性继承
}
Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student; // 修复constructor
Student.prototype.getGrade = function() {
return 'Grade: ' + this.grade;
};
let alice = new Student('Alice', 18, 'Student', 5);
console.log(alice.getInfo()); // Name: Alice, Age: 18, Job: Student
console.log(alice.getGrade()); // Grade: 5
在上面的代码中,我们定义了一个Person
构造函数和一个Student
构造函数。我们通过Person.call(this, name, age, job)
来实现Student
类的属性继承,然后通过Student.prototype = Object.create(Person.prototype)
来实现Student
类的方法继承。
3.2 class继承
在ES6中,引入了class概念,使得面向对象编程更加简单和方便。使用class创建一个类,可以通过extends
关键字来继承一个已有的类,也可以通过super
关键字来调用父类的方法。
class Person {
constructor(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
}
getInfo() {
return 'Name: ' + this.name + ', Age: ' + this.age + ', Job: ' + this.job;
}
}
class Student extends Person {
constructor(name, age, job, grade) {
super(name, age, job);
this.grade = grade;
}
getGrade() {
return 'Grade: ' + this.grade;
}
}
let alice = new Student('Alice', 18, 'Student', 5);
console.log(alice.getInfo()); // Name: Alice, Age: 18, Job: Student
console.log(alice.getGrade()); // Grade: 5
在上面的代码中,我们定义了一个Person
类和一个Student
类。我们使用extends
关键字来实现Student
类的继承,并使用super
关键字来调用父类的构造函数和方法。
4. 小结
在本文中,我们介绍了JavaScript面向对象编程的概念,并详细介绍了两种创建对象的方式:工厂函数和构造函数。同时,我们也学习了如何通过继承来避免重复编写代码,其中包括原型继承和class继承。
总之,掌握面向对象编程是每个JavaScript开发人员都应具备的基本技能之一,它可以帮助我们更好地组织和管理代码,提高代码复用性和可维护性。