【复习】javascript es6之前的继承(组合继承)

    技术2022-07-11  78

    es6之前没有提供extends关键字用于类的继承,但是可以通过构造函数+原型对象模拟实现继承,被称为组合继承

    组合继承分为两步:

    一是属性的继承,在构造函数中添加改变this指向的call()方法让父类的this指向子类二是方法的继承,将父类的实例赋值给子类的的原型对象(prototype),再将子类原型对象上的构造器(constructor)指回子类

     

    属性继承示例

      Father.call(this,...)  在子类构造器中使用,使得父类的this指向子类

    // 属性继承: // 在子类调用父类函数,用call改变this指向 function Father (uname, age) { this.uname = uname; this.age = age; } var o = new Father('张三丰', 22); //console.log(o); // 继承 function Son (uname, age, score) { // this指向不同 // Father(uname, age); // 如果调用Father函数,并且能够把Father里面的this指向儿子的实例对象 Father.call(this, uname, age); this.score = score; } var obj = new Son('儿子', 19, 66); console.log(obj);

     

      方法继承示例

      将父类的实例赋值给子类的原型对象,这时候父类的实例开辟了新的内存空间,使得继承不会影响原来的父类原型对象,且父类实例拥有父类的方法,赋值过去后,子类拥有了父类的方法,实现继承后,需要将子类原型对象上的构造器(constructor)指回子类

    // 方法继承 function Father () {} Father.prototype.say = function () { console.log('say方法'); } // 继承 function Son () {} // 如果继承下来父类的方法啦,那么要再子类的原型对象 // 父实例对象赋值给子原型对象,指回构造函数本身 Son.prototype = new Father(); // Son.prototype.chi = function () { // console.log('吃饭'); // } //子类原型对象上的构造器指回子类 Son.prototype.constructor = Son; console.log( Son.prototype ); //console.log( Father.prototype ); var obj = new Son(); //obj.say(); //obj.chi(); // console.log( obj );

     

     

    Processed: 0.013, SQL: 9