当我们需要在一个类中使用另一个类的属性和方法,就需要使用继承来实现。在 JavaScript 中,有以下几种常见的继承方式:
1. 原型链继承
原型链继承是指将父类的实例作为子类的原型,既父类的属性和方法都会成为子类的实例属性和方法,我们可以使用如下代码来实现:
function Parent() {
this.name = 'Parent';
}
Parent.prototype.getName = function() {
return this.name;
}
function Child() {}
Child.prototype = new Parent();
var child = new Child();
console.log(child.getName()); // 'Parent'
在这段代码中,我们首先定义了一个 Parent
构造函数,它拥有一个 name
属性和一个 getName
方法,然后我们定义了一个 Child
构造函数,并将 Child
的原型对象设置为 new Parent()
,这样 Child
就拥有了 Parent
的所有属性和方法,包括 name
属性和 getName
方法。最后调用 child.getName()
将打印出 Parent
。
原型链继承的缺点是所有子类实例都共享同一个父类实例,因此不能通过修改子类实例上的属性或方法来修改父类实例。
2. 借助构造函数继承
借助构造函数继承是指在子类构造函数中调用父类构造函数,这样子类实例就拥有了父类实例的属性和方法了。我们可以使用如下代码来实现:
function Parent(name) {
this.name = name;
}
Parent.prototype.getName = function() {
return this.name;
}
function Child(name) {
Parent.call(this, name); // 调用父类构造函数
}
var child = new Child('Child');
console.log(child.getName()); // 'Child'
在这段代码中,我们首先定义了一个 Parent
构造函数,它拥有一个 name
属性和一个 getName
方法,然后我们定义了一个 Child
构造函数,并在其中调用了 Parent.call(this, name)
来调用父类构造函数,并将 name
作为参数传入。这样 Child
就拥有了 Parent
的 name
属性和 getName
方法。最后调用 child.getName()
将打印出 Child
。
借助构造函数继承的缺点是父类原型上的属性和方法无法被子类继承,因为子类只能继承父类的实例属性和方法,而不是原型属性和方法。
3. 组合继承
组合继承是指同时使用原型链继承和借助构造函数继承两种方式来继承父类,这样既能继承父类原型上的属性和方法,也能继承父类实例上的属性和方法。我们可以使用如下代码来实现:
function Parent(name) {
this.name = name;
}
Parent.prototype.getName = function() {
return this.name;
}
function Child(name) {
Parent.call(this, name); // 调用父类构造函数
}
Child.prototype = new Parent(); // 继承父类原型
Child.prototype.constructor = Child; // 修复构造函数指向
var child = new Child('Child');
console.log(child.getName()); // 'Child'
在这段代码中,我们首先定义了一个 Parent
构造函数,它拥有一个 name
属性和一个 getName
方法,然后我们定义了一个 Child
构造函数,它通过 Parent.call(this, name)
调用了父类构造函数,并且将 Child
的原型对象设置为 new Parent()
,这样 Child
就同时继承了父类原型上的属性和方法,以及父类实例上的属性和方法。
组合继承的缺点是在定义子类时会调用两次父类构造函数,一次在 Child.prototype = new Parent()
中,一次在 Parent.call(this, name)
中,这样会造成一些性能上的问题。
除了以上三种继承方式,我们还可以使用 ES6 中的 class
和 extends
关键字来实现继承,也可以使用 Object.create()
方法来实现寄生式继承和寄生组合继承等。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript中常见的几种继承方式 - Python技术站