新手也能听懂的JavaScript面向对象编程入门

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开发人员都应具备的基本技能之一,它可以帮助我们更好地组织和管理代码,提高代码复用性和可维护性。