1. 程式人生 > >構造函數繼承--call,apply

構造函數繼承--call,apply

類函數 The 變調 原型 練習 class span ons bind

構造函數繼承的原理 : 通過改變this指向來實現繼承(在子類中使用call或apply的方式調用父類 讓父類中的this指向子類new出來的對象)

  語法格式:

    function 子類函數名(參數1,參數2){

      父類函數名.call(this,參數1,參數2); //註: 實例繼承

    }

    function 子類函數名(參數1,參數2){

      父類函數名.apply(this,arguments或者[參數1,參數2,參數3,......]); //註: 實例繼承

    }

call和apply的特點:

  兩個都只能繼承實例不能繼承原型,第一個參數的this都一樣,指的是當前對象. call的第二個參數開始是參數列表,apply的第二個參數是數組或者arguments

  可以執行函數,可以帶入參數,可以改變調用函數中this的指向,不能用於創建函數 call方法的練習:
    function fn3(num){
        this.a = num;     //obj1.a = 10
        fn4(this);      //調用fn4將obj1對象傳遞到fn4
    }
    function fn4(obj){
        obj.b = 10;        //為obj1添加新的屬性b和c
        obj.c = 20;
    }
    var obj1 = {};  //定義一個對象,此時該對象沒有任何屬性
    fn3.call(obj1,10);  //調用fn3函數,讓該函數中的this指向obj1,並傳遞參數10
    console.log(obj1);  //{a:10,b:10,c:20}

apply方法練習:

    function Father(tel,name,age){
        this.money = 99999999;
        this.name = name;
        this.age = age;
        this.tel = tel;
        this.dance = function(){
            console.log("會跳舞");
        }
    }

    function Son(tel,name,age){
        //在子類中使用call、或apply或bind調用父類的構造函數 並將父類中的this指向子類對象
        //Father.call(this,tel,name,age);
        //Father.apply(this,[tel,name,age]);
        Father.apply(this,arguments);    //在使用arguments的時候傳遞參數的順序,和接收參數的順序必須保持一致
    }
    var son = new Son("132xx","xm",13);
    var son1 = new Son("133xx","xh",18);
    console.log( son,son1 );
              

構造函數繼承--call,apply