返回

走进JS原型和继承,一文看懂!

前端

什么是原型和继承?

在JS中,原型是所有对象都拥有的一个特殊属性。原型对象存储着对象的属性和方法,并被所有继承自该对象的子对象共享。继承是一种创建新对象的机制,新对象可以从其父对象继承属性和方法。

原型链

每个JS对象都有一个指向其原型的内部指针,这个指针称为原型链。原型链允许对象访问其原型对象的所有属性和方法。如果一个对象没有某个属性或方法,JS会自动沿着原型链向上查找,直到找到该属性或方法为止。

基于原型实现的继承

在JS中,继承是通过原型实现的。当一个对象被创建时,它会自动获得一个指向其父对象的指针。这意味着子对象可以访问父对象的所有属性和方法。如果子对象没有某个属性或方法,JS会自动沿着原型链向上查找,直到找到该属性或方法为止。

构造函数

构造函数是一种创建新对象的函数。当一个构造函数被调用时,它会创建一个新的对象,并将该对象作为返回值。构造函数可以接收参数,这些参数将被赋予新对象的属性和方法。

面向对象编程

面向对象编程(OOP)是一种编程范式,它将程序分解成一系列的对象。每个对象都有自己的属性和方法,并且可以与其他对象交互。OOP有助于提高代码的可重用性和可维护性。

在ES6中,引入了类(class)的概念。类是一种创建对象的模板。类可以包含属性和方法,并且可以被其他类继承。

方法

方法是对象的属性,它是一种函数。方法可以被调用,并可以接收参数和返回值。

实例

// 定义一个父类
class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  // 定义一个方法
  speak() {
    console.log(`My name is ${this.name} and I am ${this.age} years old.`);
  }
}

// 定义一个子类
class Student extends Person {
  constructor(name, age, school) {
    super(name, age);
    this.school = school;
  }

  // 覆盖父类的方法
  speak() {
    super.speak();
    console.log(`I am a student at ${this.school}.`);
  }
}

// 创建一个父类对象
const person = new Person('John Doe', 30);

// 创建一个子类对象
const student = new Student('Jane Doe', 20, 'Harvard University');

// 调用父类方法
person.speak();

// 调用子类方法
student.speak();

输出:

My name is John Doe and I am 30 years old.
My name is Jane Doe and I am 20 years old.
I am a student at Harvard University.

总结

原型和继承是JS核心基础知识。原型是所有对象都拥有的一个特殊属性,存储着对象的属性和方法。原型链允许对象访问其原型对象的所有属性和方法。基于原型实现的继承允许子对象继承父对象的所有属性和方法。构造函数是一种创建新对象的函数。OOP是一种编程范式,它将程序分解成一系列的对象。类是一种创建对象的模板。方法是对象的属性,它是一种函数。