返回

继承的不同类型及其工作原理

前端

继承的类型

在计算机科学中,继承是一种允许类或对象从现有类或对象获取属性和方法的机制。这是一种强大的工具,可以帮助开发人员构建更灵活、更可重用的代码。

继承有四种主要类型:

  1. 原型继承
  2. 借用构造函数继承
  3. 组合继承
  4. 拷贝继承

原型继承

原型继承是一种在 JavaScript 中常见的继承方式。在原型继承中,每个对象都有一个原型对象,该原型对象包含了该对象的所有属性和方法。当一个对象需要访问一个它没有的属性或方法时,它会沿着原型链向上查找,直到找到该属性或方法。

例如,以下代码演示了原型继承:

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);

const student = new Student('John Doe', 'Computer Science');

student.greet(); // Hello, my name is John Doe

在这个例子中,Student 类从 Person 类继承。当我们创建一个 Student 对象时,它会自动继承 Person 类的所有属性和方法。我们也可以向 Student 类添加自己的属性和方法,例如 major 属性。

借用构造函数继承

借用构造函数继承是一种在 JavaScript 中常见的继承方式。在借用构造函数继承中,子类使用父类的构造函数来初始化自己的属性。这可以确保子类拥有父类的所有属性。

例如,以下代码演示了借用构造函数继承:

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

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

const student = new Student('John Doe', 'Computer Science');

console.log(student.name); // John Doe
console.log(student.major); // Computer Science

在这个例子中,Student 类从 Person 类继承。当我们创建一个 Student 对象时,我们使用 Person 类的构造函数来初始化 name 属性。然后,我们使用 major 属性来初始化 Student 对象的 major 属性。

组合继承

组合继承是将原型继承和借用构造函数继承相结合的一种继承方式。组合继承可以让我们同时获得原型继承和借用构造函数继承的优点。

例如,以下代码演示了组合继承:

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;

const student = new Student('John Doe', 'Computer Science');

student.greet(); // Hello, my name is John Doe
console.log(student.major); // Computer Science

在这个例子中,Student 类从 Person 类继承。当我们创建一个 Student 对象时,我们使用 Person 类的构造函数来初始化 name 属性。然后,我们使用 major 属性来初始化 Student 对象的 major 属性。我们还将 Student 类的原型对象设置为 Person 类的原型对象的副本。这确保了 Student 类可以访问 Person 类的所有属性和方法。

拷贝继承

拷贝继承是一种通过复制父对象来创建子对象的一种继承方式。拷贝继承可以让我们轻松地创建与父对象具有相同属性和方法的子对象。

例如,以下代码演示了拷贝继承:

const person = {
  name: 'John Doe',
  age: 30
};

const student = Object.assign({}, person);

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

在这个例子中,我们使用 Object.assign() 方法来创建 student 对象。Object.assign() 方法将 person 对象的所有属性和方法复制到 student 对象中。这使得 student 对象与 person 对象具有相同