call&apply以及组合继承、拷贝继承

80 阅读1分钟
    // let obj1 = {
    //     a:'tom'
    // }
    // let obj2 = {
    //     a:'jack'
    // }
    // function f(car,house){
    //     console.log('this指向',this); 
    //     console.log(car,house);
    //     return this.a;
    // }
    // console.log( window.f() ); /* this=>window */

    /* call 和 apply 是用来改变this指向的 */

    /* call和apply都可以理解为是函数自身的方法
    第一个参数代表了 接下来this所代表的对象 */
    /* f.call(obj1) 会执行f这个方法 */
    // console.log( f.call(obj1) ) /* this=>obj1 */
    // console.log( f.call(obj2) ) /* this=>obj2 */

    // console.log( f.apply(obj1) ) /* this=>obj1 */
    // console.log( f.apply(obj2) ) /* this=>obj2 */

    /* call和apply的区别 */
    /* 使用call方法来传参 一个一个的传参 */
    // console.log( f.call(obj1,'bmw','tangc') ) /* this=>obj1 */
    /* 使用apply方法来传参 需要传一个数组 数组里面的第一个就对应了f函数里面的
    第一个参数,数组里面的第二个就对应了f函数里面的
    第二个参数 */
    // console.log( f.apply(obj1,['bmw','tangc']) )
    <!-- 
    也叫伪经典继承
    将原型链继承和构造函数继承组合在一块
    原型链实现对原型属性和方法的继承
    借用构造函数实现对实例属性的继承
 -->
 <script>
    // function Person(){
    //     /* 实例属性 */
    //     this.head = 1;
    //     this.foot = 2;
    // }

    // /* 原型属性和方法 */
    // Person.prototype.weight = '70kg';
    // Person.prototype.eat = function(){
    //     console.log('我会吃饭');
    // }
    // function Student(){
    //     /* 借用构造函数实现对实例属性的继承 */
    //     Person.call(this)
    // }
    // /* 原型链实现对原型属性和方法的继承 */
    // Student.prototype = new Person()
    // Student.prototype.contructor = Student;
    // let stu1 = new Student();
    // console.log(stu1);
    // console.log(stu1.weight);
    // stu1.eat();

    /* 
        父类 Car lunzi 4个 原型上有run方法打印 
        ${this.name} 我有4个轮子 会跑赛道
        子类 Bc 自己有name 通过传参获得 
        继承 实例属性 lunzi 和 原型方法run
        要求 用子类的方法 打印出  例如 : 奔驰 有 4 个轮子 会跑赛道
        使用组合继承的方法
    */
    function Car(){
        this.lunzi = 4;
    }
    Car.prototype.run = function (){
        document.write(`
            ${this.name} 我有${this.lunzi}个轮子 会跑赛道
        `);
    }
    function Bc(name){
        Car.call(this)
        this.name = name;
    }
    Bc.prototype = new Car();
    Bc.prototype.constructor = Bc;

    let bc1 = new Bc('奔驰')
    console.log(bc1);
    bc1.run();


 </script>