ES5组合继承

ES6之前没有提供extends继承,我们通过 构造函数+原型对象 模拟实现继承,被称为 组合继承
1.call() 调用函数,并修改函数运行时this的指向

fun.call(thisArg,arg1,arg2…)

thisArg:当前调用函数this的指向对象
arg1,arg2:传递其他参数

<script>
        //call 方法
        function fn(x, y) {
            console.log("卡卡卡卡");
            console.log(this); //fn.call();指向window
            //fn.call(obj);指向obj
            console.log(x + y);
        }
        var obj = {
            name: 'andy',
        };
        //fn();  this指向的是window  只不过window省略了
        //1.call()可以直接调用函数
        // fn.call();
        //2.可以改变函数的this指向  指向某一个对象 比如此时就指向了obj 后面两个是参数  实参  
        fn.call(obj, 1, 2);
    </script>

1.借用父构造函数继承属性

//1.父构造函数
        function Father(uname, age) {
            //this 指向父构造函数的实例对象 
            this.uname = uname;
            this.age = age;
        }
        //2.子构造函数
        function Son(uname, age) {
            //this 指向子构造函数的实例对象
            //让父构造函数的this指向子构造函数 这样子构造函数就可以使用uname age属性了
            //this  把父构造函数的this换成子构造函数的this
            Father.call(this, uname, age);
        }
        var son = new Son('刘德华', 18);
        console.log(son);

2.借用父构造函数继承方法

  <script>
        //1.父构造函数
        function Father(uname, age) {
            //this 指向父构造函数的实例对象 
            this.uname = uname;
            this.age = age;
        }
        Father.prototype.money = function() {
            console.log(10000000);
        };
        //2.子构造函数
        function Son(uname, age, score) {
            //this 指向子构造函数的实例对象
            //让父构造函数的this指向子构造函数 这样子构造函数就可以使用uname age属性了
            //this  把父构造函数的this换成子构造函数的this
            Father.call(this, uname, age);
            this.score = score;
        }
        //这样直接赋值  会有问题
        //Son.prototype = Father.prototype; //相当于把父构造函数的原型对象给了子构造函数的原型对象 地址也赋值给了子构造函数原型对象
        //子构造函数原型对象一改变 父构造函数原型对象也会发生改变  这样不科学!

        //这是子构造函数专门的方法
        Son.prototype = new Father(); //把实例对象 赋值 给 原型对象  因为father的实例对象有一个__proto__对象原型 可以访问father原型对象  进而访问money()方法
        //如果利用对象的形式修改了原型对象  别忘了constructor指回原来的构造函数
        Son.prototype.constructor = Son;
        Son.prototype.exam = function() {
            console.log('孩子要考试');
        }

        var son = new Son('刘德华', 18, 10000);
        console.log(son);
        console.log(Father.prototype);
        console.log(Son.prototype.constructor);
    </script>

Son:
Son
Father.prototype:
Father.prototype
构造函数和原型、原型链:https://blog.csdn.net/qq_42156918/article/details/108670032

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值