返回

直击 JavaScript 原型与原型链的精髓,深度剖析对象继承机制

前端

JavaScript 中的原型是什么?

在 JavaScript 中,每个对象都有一个原型对象,原型对象包含了该对象的所有属性和方法。当访问一个对象的属性或方法时,JavaScript 会先在该对象中查找,如果找不到,则会沿着原型链向上查找,直到找到该属性或方法。

原型对象可以通过 Object.getPrototypeOf() 方法获取。例如:

const obj = {
  name: "John Doe",
  age: 30
};

const prototype = Object.getPrototypeOf(obj);

console.log(prototype); // {__proto__: null}

JavaScript 中的原型链是什么?

原型链是 JavaScript 中对象继承的基础。每个对象都有一个原型对象,而原型对象又可能有自己的原型对象,如此递归地形成了一条链,这条链就叫做原型链。

当访问一个对象的属性或方法时,JavaScript 会先在该对象中查找,如果找不到,则会沿着原型链向上查找,直到找到该属性或方法。这种机制可以让我们轻松地实现对象继承,无需像其他语言那样显式地使用继承。

对象继承的实现

在 JavaScript 中,对象继承可以通过两种方式实现:基于原型的继承和基于类的继承。

基于原型的继承

基于原型的继承是 JavaScript 中最常见的继承方式。在这种继承方式下,子对象通过原型链继承父对象的属性和方法。例如:

const parentObj = {
  name: "John Doe",
  age: 30
};

const childObj = Object.create(parentObj);

console.log(childObj.name); // John Doe
console.log(childObj.age); // 30

在上面的代码中,childObj 是 parentObj 的子对象,childObj 通过原型链继承了 parentObj 的 name 和 age 属性。

基于类的继承

基于类的继承是 JavaScript 中另一种常见的继承方式。在这种继承方式下,子类通过 extends 关键字继承父类的属性和方法。例如:

class ParentClass {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  greet() {
    console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
  }
}

class ChildClass extends ParentClass {
  constructor(name, age, school) {
    super(name, age);
    this.school = school;
  }

  goToSchool() {
    console.log(`I am going to ${this.school}.`);
  }
}

const parent = new ParentClass("John Doe", 30);
const child = new ChildClass("Jane Doe", 25, "Harvard University");

parent.greet(); // Hello, my name is John Doe and I am 30 years old.
child.greet(); // Hello, my name is Jane Doe and I am 25 years old.
child.goToSchool(); // I am going to Harvard University.

在上面的代码中,ChildClass 是 ParentClass 的子类,ChildClass 通过 extends 关键字继承了 ParentClass 的属性和方法。

结语

原型和原型链是 JavaScript 中对象继承的基础。通过理解原型和原型链的概念,我们可以更好地理解 JavaScript 中的对象系统,并可以轻松地实现对象继承。