返回
不变的力量:继承方法顶级总结
前端
2023-12-22 14:56:32
继承是对象面向编程中的重要概念之一,它允许子类对象继承父类对象的行为和属性。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中提供了两种常用的继承方法:原型链继承和借用构造函数的原型方法。原型链继承是一种简单易懂的继承方式,但子类对象可能会继承父类对象不需要的属性和方法。借用构造函数的原型方法是一种灵活的继承方式,可以只继承父类的一部分方法,但子类对象不能访问父类对象的私有属性和方法。在选择继承方法时,需要根据具体情况进行权衡。