返回

走进JS之父的智慧结晶,解密JS继承的奥秘

前端

在计算机编程的领域,继承是面向对象编程思想中的一个核心概念,它指的是一个对象可以从另一个对象中获得属性和方法。在JavaScript中,继承并不是通过关键词来实现的,而是通过原型链的机制。
原型链的概念并不复杂,它是一种对象之间的联系方式。每个对象都有一个原型对象,原型对象本身也是一个对象,也拥有自己的原型对象,以此类推,直到原型链的尽头。当一个对象需要访问一个属性或方法时,它会首先在自身查找,如果没有找到,就会沿着原型链向上查找,直到找到为止。

构造函数

构造函数在JavaScript中扮演着重要的角色,它是创建新对象并对其进行初始化的函数。在JavaScript中,构造函数的名称通常以大写字母开头。例如:

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

这个构造函数创建一个Person对象,并为其添加一个name属性。

原型对象

原型对象是构造函数的一个属性,它指向一个对象,这个对象包含了该构造函数的所有实例共享的属性和方法。例如:

Person.prototype = {
  greet: function() {
    console.log("Hello, my name is " + this.name);
  }
};

这个原型对象为Person构造函数的所有实例添加了一个名为greet的方法。

原型链

原型链是JavaScript中对象之间的一种联系方式。每个对象都有一个原型对象,原型对象本身也是一个对象,也拥有自己的原型对象,以此类推,直到原型链的尽头。当一个对象需要访问一个属性或方法时,它会首先在自身查找,如果没有找到,就会沿着原型链向上查找,直到找到为止。

const person1 = new Person("John");
person1.greet(); // Hello, my name is John

在这个例子中,person1是Person构造函数的一个实例。当person1调用greet方法时,JavaScript会首先在person1对象中查找该方法,如果没有找到,就会沿着原型链向上查找,直到找到Person.prototype对象。在Person.prototype对象中,greet方法被找到,并被调用。

ES6中的继承

在ES6中,JavaScript引入了class,这使得JavaScript的继承语法更加接近其他面向对象编程语言。例如:

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

  greet() {
    console.log("Hello, my name is " + this.name);
  }
}

class Employee extends Person {
  constructor(name, jobTitle) {
    super(name);
    this.jobTitle = jobTitle;
  }

  work() {
    console.log("I'm working as a " + this.jobTitle);
  }
}

const employee1 = new Employee("John", "Software Engineer");
employee1.greet(); // Hello, my name is John
employee1.work(); // I'm working as a Software Engineer

在这个例子中,Employee类继承了Person类。Employee类拥有Person类的所有属性和方法,同时还拥有自己的属性和方法。

总结

继承是面向对象编程中一个重要的概念,它允许对象从其他对象中获取属性和方法。在JavaScript中,继承是通过原型链的机制实现的。在ES6中,JavaScript引入了class关键字,这使得JavaScript的继承语法更加接近其他面向对象编程语言。