借用继承(call继承,构造继承)

            借用构造函数继承

                + 继承 => 两个构造函数之间的关系

                    == 为了让子类的实例使用父类的属性和方法

                + 继承方案

                    == 在子类的构造函数体内,借用构造函数执行一下

                    == 并且强行让父类的构造函数的this指向子类的实例

            借用构造函数继承的优缺点

                + 优点

                    1 继承来 的属性写在了自己的身上

                        == 就不需要去__proto__上找了

                    2 自己需要的两个属性的值,在一个构造函数的时候传递

                        == 不想原型继承需要在两个地方传递参数

                + 缺点

                    1 只能继承父类的属性

                        == 不能继承父类原型prototype上的方法

                        == 写在构造函数体内的都可以继承下来

            call是改变函数内部this指向的方法之一

                + 调用是跟在函数后面的

                    + fn() => fn.call()

                    + obj.fn() => obj.fn.call()

                + 目的是强行改变本次调用的this指向

                    + 不管你本身函数内部的this指向谁

                    + 我让你本次指向谁就指向谁

                + 语法:函数名.call(你要改变的函数this指向,给函数传递的实参1,给函数传递的实参2,...)

特点: 将父类的构造函数当做普通函数来进行执行,使用call改变this的指向

优点: 可以将父类里面的属性继承一份,变成自己自己身上的属性

缺点: 不能继承父类里面的方法

        // 1 准备一个父类

        function Person(name,gender){

            this.name = name;

            this.gender = gender;

        }

        // 原型上添加一个方法

        Person.prototype.sayHi = function(){

            console.log('hi')

        }

        // 2 准备一个子类

        function Student(age,name,gender){

            // 构造函数里面的this是本次的实例对象

            this.age = age;

            // 此时Person作为普通函数调用,Person里面的this是window

            // name属性和gender属性加在了window上

            // 直接调用父类的构造函数无法实现继承

            // Person(name,gender);


 

            // 必须要调用Person的时候,让Person函数里面的this和Student里面的this是一样的,也就是实例对象

            // 如何改变函数本地调用的this指向?

            Person.call(this,name,gender)

            // this.name = name;

            // this.gender = gender;

            // 上面的代码等价于

            // Person.call(this,name,gender)

        }

        // 在同一个位置传递参数,只需要多写几个行参就可以

        let s = new Student(18,'lucy','女');

        /*

            s = {

                age:18,

                name:'lucy',

                gender:'女'

            }

        */

        console.log(s)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值