返回

解析原型寄生式组合继承的妙用,体会它和传统组合继承的区别!

前端

前言:通向组合式继承的多条道路

在谈论原型寄生式组合继承之前,我们应该先去回顾组合式继承这个概念。组合式继承指的是通过某种方法,结合构造函数和原型继承,将子类的原型指向父类实例的方法。在JavaScript中,组合式继承有两种实现方式,分别是传统组合式继承和原型寄生式组合继承。

传统组合式继承的实现方式如下:

function Person(name, age) {
    this.name = name;
    this.age = age;
}

Person.prototype.sayHello = function() {
    console.log("Hello, my name is " + this.name);
};

function Student(name, age, major) {
    Person.call(this, name, age);
    this.major = major;
}

// 关键:修改子类的原型对象直接指向父类实例
Student.prototype = new Person();

Student.prototype.study = function() {
    console.log("I'm studying " + this.major);
};

原型寄生式组合继承的实现方式如下:

function Person(name, age) {
    this.name = name;
    this.age = age;
}

Person.prototype.sayHello = function() {
    console.log("Hello, my name is " + this.name);
};

function Student(name, age, major) {
    var o = new Object();  // 创建一个空对象
    o.name = name;
    o.age = age;
    o.major = major;

    // 关键:将父类实例赋给该空对象
    o.__proto__ = Person.prototype;

    return o;
}

Student.prototype.study = function() {
    console.log("I'm studying " + this.major);
};
特性 传统组合式继承 原型寄生式组合继承
子类原型对象 直接指向父类实例 指向一个空对象,该空对象__proto__指向父类实例
子类实例创建方式 直接调用父类构造函数 先创建一个空对象,再将父类实例赋给该空对象
子类原型对象的污染 会污染 不会污染
内存占用 更高 更低

原型寄生式组合继承的主要优势在于它不会污染子类原型对象,也不会在创建子类实例时重新创建父类实例,这对于内存优化至关重要。此外,原型寄生式组合继承还可以避免某些情况下传统组合式继承可能出现的循环引用的问题。

原型寄生式组合继承是一种非常实用的继承方式,它结合了原型继承和构造函数继承的优点,弥补了传统组合式继承的不足。在实际项目中,原型寄生式组合继承经常被用来实现子类和父类的多重继承,以及某些特殊的继承需求。