实现JavaScript中继承的三种方式包括:原型链继承、构造函数继承和组合继承。
1. 原型链继承
原型链继承是通过将子类的原型指向父类实例来实现继承的。代码示例如下:
// 父类
function Person(name) {
this.name = name;
}
Person.prototype.sayHello = function() {
console.log(`Hello, I'm ${this.name}`);
};
// 子类
function Student(name, grade) {
this.grade = grade;
}
// 子类继承父类
Student.prototype = new Person();
// 测试代码
const stu = new Student('Tom', 5);
stu.sayHello(); // Hello, I'm Tom
console.log(stu.grade); // 5
原型链继承的缺点是父类构造函数的属性和方法不能被继承,因为子类的原型对象是父类的实例。而且多个子类实例共享同一个父类实例,可能导致修改一个实例的属性会影响到其他实例。
2. 构造函数继承
构造函数继承是通过在子类构造函数中调用父类构造函数来实现的。代码示例如下:
// 父类
function Person(name) {
this.name = name;
this.sayHello = function() {
console.log(`Hello, I'm ${this.name}`);
}
}
// 子类
function Student(name, grade) {
Person.call(this, name);
this.grade = grade;
}
// 测试代码
const stu = new Student('Tom', 5);
stu.sayHello(); // Hello, I'm Tom
console.log(stu.grade); // 5
构造函数继承的优点是可以继承父类构造函数的属性和方法,每个实例都有自己独立的属性和方法。缺点是不能继承父类原型链上的方法。
3. 组合继承
组合继承是通过将原型链继承和构造函数继承结合起来使用的方式。代码示例如下:
// 父类
function Person(name) {
this.name = name;
}
Person.prototype.sayHello = function() {
console.log(`Hello, I'm ${this.name}`);
};
// 子类
function Student(name, grade) {
Person.call(this, name);
this.grade = grade;
}
// 子类继承父类原型
Student.prototype = new Person();
// 修正子类原型的constructor属性
Student.prototype.constructor = Student;
// 测试代码
const stu = new Student('Tom', 5);
stu.sayHello(); // Hello, I'm Tom
console.log(stu.grade); // 5
组合继承既能继承父类构造函数的属性和方法,也能继承父类原型链上的方法。但是这种方法会调用两次父类构造函数,一次在子类构造函数中调用,一次在子类原型上指定父类实例。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:实现JavaScript中继承的三种方式 - Python技术站