继承(构造函数+原型对象模拟实现继承)

继承

我们可以通过构造函数+原型对象模拟实现继承,被称为组合继承。
call()

调用这个函数, 并且修改函数运行时的this 指向

fun.call(thisArg, arg1, arg2, ...);call把父类的this指向子类

thisArg :当前调用函数this 的指向对象

arg1,arg2:传递的其他参数

利用构造函数实现子类的继承:

属性的继承

function Father (uname,age) {
            // this指向父类的实例对象
            this.uname = uname;
            this.age = age;
            // 只要把父类的this指向子类的this既可
        }
        function Son (uname, age,score) {
            // this指向子类构造函数
            // this.uname = uname;
            // this.age = age;
            // Father(uname,age);
            Father.call(this,uname,age);
            this.score = score;
        }
        Son.prototype.sing = function () {
            console.log(this.uname + '唱歌')
        }
        var obj = new Son('刘德华',22,99);
        console.log(obj.uname);
        console.log(obj.score);
        obj.sing();

方法的继承:

实现方法把父类的实例对象保存给子类的原型对象

一般情况下,对象的方法都在构造函数的原型对象中设置,通过构造函数无法继承父类方法。核心原理:

①将子类所共享的方法提取出来,让子类的prototype 原型对象= new 父类()  

②本质:子类原型对象等于是实例化父类,因为父类实例化之后另外开辟空间,就不会影响原来父类原型对象

③将子类的constructor指向原构造函数

把父类的实例对象赋值给子类的原型
function Father () {

        }
        Father.prototype.chang = function () {
            console.log('唱歌');
        }

        function Son () {

        }
        // Son.prototype = Father.prototype;
        Son.prototype = new Father();
        var obj = new Son();
        obj.chang();

        Son.prototype.score = function () {
            console.log('考试');
        }

        // obj.score();
        // console.log(Son.prototype);
        console.log(Father.prototype);

注意:一定要让Son指回构造函数

实现继承后,让Son指回原构造函数
实现继承后,让Son指回原构造函数

Son.prototype = new Father();

Son.prototype.constructor = Son;

总结:用构造函数实线属性继承,用原型对象实线方法继承

 
posted @ 2020-02-28 19:26  午亭爱成长  阅读(327)  评论(0编辑  收藏  举报