返回
JavaScript进阶(六)继承:多面体剖析
前端
2024-02-07 11:37:30
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 中的类都是实现继承的有效方式。