返回

不变的力量:继承方法顶级总结

前端

继承是对象面向编程中的重要概念之一,它允许子类对象继承父类对象的行为和属性。ES5中提供了两种常用的继承方法:原型链继承和借用构造函数的原型方法,它们具有各自的优点和缺点。

原型链继承

原型链继承是最基本和最常用的继承方法。在ES5中,每个对象都有一个原型对象,原型对象又可以有自己的原型对象,如此形成一个原型链。子类对象可以通过原型链访问父类对象的属性和方法。

// 父类构造函数
function Person(name) {
  this.name = name;
}

// 子类构造函数
function Student(name, age) {
  // 调用父类构造函数
  Person.call(this, name);

  this.age = age;
}

// 创建子类实例
const student = new Student('John', 20);

// 访问父类属性
console.log(student.name); // John

// 访问子类属性
console.log(student.age); // 20

在上面的例子中,Student类继承了Person类的属性和方法。Student类的原型对象指向Person类的实例,因此Student类的实例可以访问Person类的属性和方法。

借用构造函数的原型方法

借用构造函数的原型方法是一种比较灵活的继承方法。它允许子类对象使用父类构造函数的原型方法,而不需要继承父类对象的行为和属性。

// 父类构造函数
function Person(name) {
  this.name = name;
}

// 子类构造函数
function Student(name, age) {
  // 不调用父类构造函数

  this.name = name;
  this.age = age;
}

// 借用父类构造函数的原型方法
Student.prototype = Object.create(Person.prototype);

// 创建子类实例
const student = new Student('John', 20);

// 访问父类属性
console.log(student.name); // John

// 访问子类属性
console.log(student.age); // 20

// 访问父类方法
console.log(student.sayHello()); // Hello, I'm John

在上面的例子中,Student类没有继承Person类的属性和方法,但它可以使用Person类的原型方法。Student类的原型对象指向Person类的原型对象,因此Student类的实例可以访问Person类的原型方法。

比较

原型链继承和借用构造函数的原型方法各有优缺点:

特性 原型链继承 借用构造函数的原型方法
继承方式 子类对象通过原型链访问父类对象的属性和方法 子类对象使用父类构造函数的原型方法
继承类型 行为和属性继承 仅方法继承
优点 简单易懂 灵活,可以只继承父类的一部分方法
缺点 子类对象可能会继承父类对象不需要的属性和方法 子类对象不能访问父类对象的私有属性和方法

总结

ES5中提供了两种常用的继承方法:原型链继承和借用构造函数的原型方法。原型链继承是一种简单易懂的继承方式,但子类对象可能会继承父类对象不需要的属性和方法。借用构造函数的原型方法是一种灵活的继承方式,可以只继承父类的一部分方法,但子类对象不能访问父类对象的私有属性和方法。在选择继承方法时,需要根据具体情况进行权衡。