有关继承--call()方法 / 组合继承

继承

ES6可以使用extends实现继承,ES6之前并没有提供extends继承,我们可以通过构造函数+原型对象模拟实现继承,被称为组合继承

call()方法

调用这个函数,并且修改函数运行时的this指向
fun.call (thisArg , arg1 ,arg2, .....)
参数:
thisArg :当前调用函数的this指向对象
arg1 ,arg2:传递的其他参数

      //call方法
        function fn(x,y) {
            console.log("继承");
            console.log(this); //指向window
        }
        var o = {
                name: 'andy'
        }
        // fn();  以前的调用方式
        //1.call() 可以调用函数
        fn.call(); //输出 继承
        //2.call()可以改变这个函数的this指向
        fn.call(o,1,2);//指向的是对象o 1传递给x,2传递给y,o不参与传递,只是为了改变指向
借用构造函数继承父类型属性

核心原理:通过call()把父类型的 this 指向子类型的this,这样就可以实现子类型继承父类型的属性

      // 借用构造函数继承父类型属性
        //1.父构造函数
        function Father(uname, age) {
            //this指向父构造函数的对象实例
            this.uname = uname;
            this.age = age;
        }
        //2.子构造函数
        function Son(uname, age, score) {
            //this指向子构造函数的对象实例
            Father.call(this, uname, age);
            //首先调用了父构造函数,然后把父构造函数里面的this指向改为指向子构造函数
            //还可添加子构造函数自己的属性
            this.score = score;
        }
        var ldh = new Son("刘德华", 18, 100);
        console.log(ldh);
借用构造函数继承父类型方法

不能直接把父构造函数方法直接赋值给子构造函数,因为这样做的话,子构造函数的方法是指向父构造函数方法的地址,此时如果给子构造函数增加它的方法,会连带着父构造函数的方法一起更改。

Son.prototype = Father.prototype这样直接赋值是错误的

应该用:Son.prototype = new Father();
PS:如果利用对象的形式修改了原型对象,别忘了利用constructor指会原来的构造函数

       // 借用构造函数继承父类型属性
        //1.父构造函数
        function Father(uname, age) {
            //this指向父构造函数的对象实例
            this.uname = uname;
            this.age = age;
        }
        Father.prototype.money = function() {
                console.log(10000);
            }
            //2.子构造函数
        function Son(uname, age, score) {
            //this指向子构造函数的对象实例
            Father.call(this, uname, age);
            //首先调用了父构造函数,然后把父构造函数里面的this指向改为指向子构造函数
            //还可添加子构造函数自己的属性
            this.score = score;
        }
        //Son.prototype = Father.prototype;  这样直接赋值是错误的
        //应该用下面这种方法
        Son.prototype = new Father();
        //如果利用对象的形式修改了原型对象,别忘了利用constructor指会原来的构造函数
        Son.prototype.constructor = Son;
        Son.prototype.exam = function() {
            console.log("考试");
        }
        var son = new Son("刘德华", 18, 100);
        console.log(son);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值