1. 原型链继承:
原型链继承是JavaScript中最基本的继承方式。每个对象都有一个原型对象,通过原型链将属性和方法沿着对象链传递下来。在原型链继承中,通过将子构造函数的原型对象指向父构造函数的实例,实现了继承。这意味着子对象可以访问父对象原型链上的属性和方法。
在这个例子中,Child对象的原型对象被设置为Parent的一个实例。这样,当我们调用child.sayHello()时,它会首先在子对象上查找sayHello方法,然后在父对象原型链上找到并执行该方法。注意:原型链继承的缺点是,所有子对象共享同一个原型对象,对原型对象的修改会影响到所有子对象。
2. 构造函数继承(经典继承):
构造函数继承是通过在子构造函数中调用父构造函数来实现继承。在构造函数继承中,通过在子构造函数中使用**call()或apply()**方法,将父构造函数的上下文设置为子对象的上下文,从而实现继承。
在这个例子中,我们通过在Child构造函数内部调用Parent构造函数,并传递子对象特定的参数,实现了继承。注意:构造函数继承只能继承父构造函数的实例属性,无法继承父构造函数的原型对象上的方法。
3. 组合继承:
组合继承结合了原型链继承和构造函数继承,既继承了父构造函数的属性,又继承了父构造函数原型对象上的方法。在组合继承中,通过调用父构造函数的方式实现属性的继承,通过将子构造函数的原型对象指向父构造函数的实例实现方法的继承。
在这个例子中,我们通过调用**Parent.call(this, name)来继承父构造函数的属性,并通过Child.prototype = new Parent()**将子构造函数的原型对象指向父构造函数的实例,从而实现方法的继承。组合继承的优点是既能够继承父构造函数的属性,又能够继承父构造函数原型对象上的方法。然而,缺点是在创建子对象时会调用两次父构造函数,一次是在设置原型时,一次是在创建子对象时。这样会产生一些不必要的开销。