91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JavaScript組合繼承的示例分析

發布時間:2022-03-04 14:08:19 來源:億速云 閱讀:113 作者:小新 欄目:開發技術

這篇文章主要為大家展示了“JavaScript組合繼承的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“JavaScript組合繼承的示例分析”這篇文章吧。

原型鏈繼承

父類實例作為子類的原型
子類創造的兩個實例的隱式原型__proto__指向父類的那個實例
而父類的實例的隱式原型__proto__又指向父類的原型father.prototype
根據原型鏈的特性,所有子類的實例能夠繼承父類原型上的屬性。

閱覽以下這張圖可以配合代碼理解清晰:

JavaScript組合繼承的示例分析

 //父類
    function father() {
      this.fatherAttr = ["fatherAttr"];
    }
    
    //父類的原型上的屬性
    father.prototype.checkProto = "checkProto";

    //子類
    function child() {}

    // 將father實例作為child這個構造函數的原型
    child.prototype = new father();
    child.prototype.constructor = child;

    //兩個子類實例
    const test1 = new child();
    const test2 = new child();

    console.log("測試1:");
    console.log("test1:", test1);
    console.log("test2:", test2);
    console.log("test1.fatherAttr:", test1.fatherAttr);
    console.log("test2.fatherAttr:", test2.fatherAttr);

    console.log("測試2:");
    test1.fatherAttr.push("newAttr");
    console.log("test1.fatherAttr:", test1.fatherAttr);
    console.log("test2.fatherAttr:", test2.fatherAttr);

    console.log("測試3:");
    console.log("test1.checkProto:", test1.checkProto);

JavaScript組合繼承的示例分析

特點:

  • 兩個實例對象都沒有fatherAttr屬性,但是因為父類的實例會擁有fatherAttr屬性,且現在父類的實例作為child的原型,根據原型鏈,他們可以共享到自己的構造函數child的原型上的屬性。(測試1)

  • 因為只有一個父類的實例作為他們的原型,所以所有實例共享了一個原型上的屬性fatherAttr,當原型上的屬性作為引用類型時,此處是數組,test1添加一個新內容會導致test2上的fatherAttr也改變了。(測試2)(缺點)

  • child構造函數不能傳遞入參。(缺點)

  • 實例可以訪問到父類的原型上的屬性,因此可以把可復用方法定義在父類原型上。(測試3)

構造函數繼承

將父類上的this綁定到子類,也就是當子類創造實例時會在子類內部調用父類的構造函數,父類上的屬性會拷貝到子類實例上,所以實例會繼承這些屬性。

//父類
    function father(params) {
      this.fatherAttr = ["fatherAttr"];
      this.params = params;
    }

    //父類的原型上的屬性
    father.prototype.checkProto = "checkProto";

    //子類
    function child(params) {
      father.call(this, params);
    }

    //兩個子類實例
    const test1 = new child("params1");
    const test2 = new child("params2");

    console.log("測試1:");
    console.log("test1:", test1);
    console.log("test2:", test2);
    console.log("test1.fatherAttr:", test1.fatherAttr);
    console.log("test2.fatherAttr:", test2.fatherAttr);

    console.log("測試2:");
    test1.fatherAttr.push("newAttr");
    console.log("test1.fatherAttr:", test1.fatherAttr);
    console.log("test2.fatherAttr:", test2.fatherAttr);
    
    console.log("測試3:");
    console.log("test1.checkProto:", test1.checkProto);

JavaScript組合繼承的示例分析

特點:

  • 兩個實例對象都擁有了拷貝來的fatherAttr屬性,所以沒有共享屬性,創造一個實例就得拷貝一次父類的所有屬性,且因為不能繼承父類原型,所以方法不能復用,被迫拷貝方法。(測試1)(缺點)

  • test1添加一個新內容只是改變了test1自己的屬性,不會影響到test2。(測試2)

  • child構造函數可以傳遞參數,定制自己的屬性。(測試1)

  • 實例不能繼承父類的原型上的屬性。(測試3)(缺點

組合繼承

結合原型鏈繼承和構造函數繼承,可以根據兩種繼承特點進行使用。

  //父類
    function father(params) {
      this.fatherAttr = ["fatherAttr"];
      this.params = params;
    }

    //父類的原型上的屬性
    father.prototype.checkProto = "checkProto";

    //子類
    function child(params) {
      //第二次調用了父類構造函數
      father.call(this, params);
    }

    // 將father實例作為child構造函數的原型
    child.prototype = new father();//第一次調用了父類構造函數
    child.prototype.constructor = child;

    //兩個實例
    const test1 = new child("params1");//從這里跳轉去子類構造函數第二次調用了父類構造函數
    const test2 = new child("params2");

    console.log("測試1:");
    console.log("test1:", test1);
    console.log("test2:", test2);
    console.log("test1.fatherAttr:", test1.fatherAttr);
    console.log("test2.fatherAttr:", test2.fatherAttr);

    console.log("測試2:");
    test1.fatherAttr.push("newAttr");
    console.log("test1.fatherAttr:", test1.fatherAttr);
    console.log("test2.fatherAttr:", test2.fatherAttr);

    console.log("測試3:");
    console.log("test1.checkProto:", test1.checkProto);

    console.log("測試4:");
    delete test1.fatherAttr
    console.log("test1:", test1);
    console.log("test1.fatherAttr:", test1.fatherAttr);

JavaScript組合繼承的示例分析

特點:

  • 兩個實例對象都擁有了拷貝來的fatherAttr屬性,創造一個實例就得拷貝一次父類的所有屬性(構造函數繼承特點,測試1),但是能訪問父類原型,可以把復用方法定義在父類原型上。(原型鏈繼承特點,測試1)

  • test1添加一個新內容只是改變了test1自己的屬性,不會影響到test2。(構造函數繼承特點,測試2)

  • child構造函數可以傳遞參數,定制自己的屬性。(構造函數繼承特點,測試1)

  • 實例能繼承父類的原型上的屬性。(原型鏈繼承特點,測試3)

  • 調用了兩次父類的構造函數,生成兩份實例,創建子類原型鏈一次,用子類創建實例時,子類內部里面一次,第二次覆蓋了第一次。(缺點)

  • 因為調用兩次父類構造函數,如果用delete刪除實例上拷貝來的fatherAttr屬性,實例仍然擁有隱式原型指向的父類實例上的fatherAttr屬性。(原型鏈繼承特點,測試4)(缺點)

以上是“JavaScript組合繼承的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

桃源县| 高平市| 英德市| 株洲市| 洛南县| 得荣县| 即墨市| 二连浩特市| 晋城| 基隆市| 资中县| 聊城市| 博乐市| 竹山县| 富民县| 中西区| 农安县| 濉溪县| 高要市| 潮安县| 宁阳县| 社旗县| 项城市| 安阳市| 江口县| 平乐县| 武夷山市| 武宁县| 出国| 甘肃省| 乌鲁木齐县| 阿拉善左旗| 东丽区| 萨迦县| 桦南县| 观塘区| 虹口区| 平谷区| 通化县| 文登市| 曲靖市|