返回

JavaScript进阶(六)继承:多面体剖析

前端

JavaScript 中的继承是很有趣的,也是很有争议的。作为一门动态语言,JavaScript 本身并不支持像 Java 或 C++ 中那样的基于类的继承。然而,JavaScript 提供了原型链和构造函数等机制,使我们可以模拟基于类的继承。在 ES6 中,我们还得到了类的语法糖,使继承更加简洁和清晰。

原型链

JavaScript 中的继承是通过原型链实现的。每个对象都有一个原型对象,原型对象又可能有一个原型对象,如此递归下去,最终到达一个没有原型对象的原型对象,这个对象就是 Object.prototype。原型链就像一个链表,每个对象都是链表中的一个节点,它的原型对象是它的父节点,而它又是它的子对象的父节点。

构造函数

构造函数是用来创建新对象的函数。当我们使用 new 调用一个构造函数时,它会创建一个新对象,并将其作为 this 参数传递给构造函数。构造函数可以用来初始化新对象的状态,并为其添加方法和属性。

ES6 中的类

ES6 中引入了一种新的语法糖来定义类,使继承更加简洁和清晰。类基本上就是一种语法糖,它在幕后仍然使用原型链和构造函数来实现继承。

继承的示例

下面是一个使用原型链实现继承的示例:

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

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

function Student(name, major) {
  Person.call(this, name);
  this.major = major;
}

Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student;

Student.prototype.study = function() {
  console.log("I am studying " + this.major);
};

const student = new Student("John", "Computer Science");
student.greet(); // Hello, my name is John
student.study(); // I am studying Computer Science

在这个示例中,Person 是父类,Student 是子类。Student 通过继承 Person 的原型对象来获得 Person 的方法和属性。

总结

JavaScript 中的继承是一种很强大的机制,它可以帮助我们重用代码,构建更健壮和可维护的应用程序。原型链、构造函数和 ES6 中的类都是实现继承的有效方式。