ES5实现继承的三种方式

59 阅读2分钟

(1) 原型链继承:原型链继承是通过让子类的原型对象指向父类的实例,实现继承父类原型上的方法。但这种方式会导致子类共享父类原型,可能出现意外的修改。

function Parent() {
    this.name = "Parent";
}

Parent.prototype.sayHello = function () {
    console.log("Hello," + this.name)
}

function Child() {
    this.age = 5
}

Child.prototype = new Parent()

(2)构造函数继承: 构造函数继承是通过在子类构造函数中调用父类构造函数,从而继承父类的属性。这种方式的缺点是无法继承父类原型上的方法,只能继承属性。

function Parent2(name) {
    this.name = name
}

function Child2(name, age) {
    Parent.call(this, name)
    this.age = age
}

(3)混合继承: 混合继承是结合构造函数继承和原型链继承的方式,通过调用父类构造函数继承属性,同时将子类原型指向一个新的对象,继承父类原型的方法。

function Parent3(name) {
    this.name = name
}

Parent3.prototype.sayHello = function () {
    console.log("Hello," + this.name)
}

function Child3(name, age) {
    Parent.call(this, name);
    this.age = age
}

// Object.create() 创建一个新的对象,防止子类对父原型对象的修改,影响到其他子类
Child3.prototype = Object.create(Parent3.prototype)

这种继承方式的演变主要是为了解决继承过程中的一些问题,比如属性共享、无法继承父类原型上的方法等。构造函数继承解决了属性继承的问题,原型链继承解决了方法继承的问题,而混合继承结合了两者的优点,解决了继承过程中的多个问题。

这种演变是为了更好地模拟类继承,使代码更易于理解和维护。然而,需要注意的是,ES5中的继承方式仍然有一些限制和问题,例如不支持多继承,而ES6引入了 class 语法来更直观地实现类继承和面向对象编程。因此,在ES6及以后的版本中,推荐使用 class 来实现继承。