在JavaScript中,可以通过以下方式实现继承:
原型链继承
- 原型链继承:利用原型链实现继承,通过将子类的原型指向父类实例来继承父类的属性和方法。示例代码如下:
function Parent() {
this.name = 'Parent';
}
Parent.prototype.sayHello = function() {
console.log('Hello, I am ' + this.name);
}
function Child() {}
Child.prototype = new Parent();
var child = new Child();
child.sayHello(); // Hello, I am Parent
构造函数继承
- 构造函数继承:在子类构造函数中调用父类构造函数,通过apply或call方法继承父类的属性和方法。示例代码如下:
function Parent(name) {
this.name = name;
}
Parent.prototype.sayHello = function() {
console.log('Hello, I am ' + this.name);
}
function Child(name, age) {
Parent.call(this, name); // 调用父类构造函数
this.age = age;
}
var child = new Child('Child', 10);
child.sayHello(); // Error: child.sayHello is not a function
组合继承
- 组合继承:结合原型链继承和构造函数继承,既继承了父类原型上的属性和方法,又继承了父类构造函数中的属性和方法。示例代码如下:
function Parent(name) {
this.name = name;
}
Parent.prototype.sayHello = function() {
console.log('Hello, I am ' + this.name);
}
function Child(name, age) {
Parent.call(this, name); // 调用父类构造函数
this.age = age;
}
Child.prototype = new Parent(); // 继承父类的原型
var child = new Child('Child', 10);
child.sayHello(); // Hello, I am Child
寄生组合继承
- 寄生组合继承:在组合继承的基础上,通过一个空函数来避免调用两次父类构造函数。示例代码如下:
function Parent(name) {
this.name = name;
}
Parent.prototype.sayHello = function() {
console.log('Hello, I am ' + this.name);
}
function Child(name, age) {
Parent.call(this, name); // 调用父类构造函数
this.age = age;
}
function inheritPrototype(child, parent) {
var prototype = Object.create(parent.prototype); // 创建父类原型的副本
prototype.constructor = child; // 修正副本的constructor
child.prototype = prototype; // 将修正后的副本赋值给子类原型
}
inheritPrototype(Child, Parent); // 继承父类原型
var child = new Child('Child', 10);
child.sayHello(); // Hello, I am Child