1. 程式人生 > >js繼承,各種繼承的優缺點(原型鏈繼承,組合繼承,寄生組合繼承)

js繼承,各種繼承的優缺點(原型鏈繼承,組合繼承,寄生組合繼承)

</pre><pre name="code" class="javascript">        //1.原型鏈實現繼承
        function father() {
            this.faName = 'father';
        }
        father.prototype.getfaName = function() {
            console.log(this.faName);
        };
        function child() {
            this.chName = 'child';
        }
        child.prototype = new father();
        child.prototype.constructor = child;
        child.prototype.getchName = function() {
            console.log(this.chName);
        };
        /*
        缺點:1.重寫子類的原型 等於 父類的一個例項,(父類的例項屬相變成子類的原型屬性)如果父類包含引用型別的屬性,那麼子類所有例項都會共享該屬性
                (包含引用型別的*原型*屬性會被例項共享)
              2.在建立子類例項時,不能向父類的建構函式傳遞引數
         */

        /*--------------------------------------------------------------------*/

        //2.原型連繼承和借用建構函式 組合實現繼承 (組合繼承解決原型鏈繼承的引用型別原型屬性被例項共享問題)
        function father(name) {
            this.faName = 'father';
        }
        father.prototype.getfaName = function() {
            console.log(this.faName);
        };
        function child(args) {
            this.chName = 'child';
            father.apply(this,[]); //第二次呼叫父類建構函式
        }
        child.prototype = new father(); //第一次呼叫父類建構函式
        child.prototype.constructor = child;
        child.prototype.getchName = function() {
            console.log(this.chName);
        };
        /*
        缺點:兩次呼叫父類建構函式:(第一次是在建立子類原型的時候,第二次是在子類建構函式內部)
              子類繼承父類的屬性,一組在子類例項上,一組在子類原型上(在子類原型上建立不必要的多餘的屬性)(例項上的遮蔽原型上的同名屬性)
              效率低
         */

        /*--------------------------------------------------------------------*/

        //3.寄生組合繼承
        /**
         * 建立一個擁有指定原型的物件 與Object.create()方法類似
         * @param  {Object} o [description]
         */
        function object(o) {
            function F() {};
            F.prototype = o;
            return new F();
        }
        /**
         * 通用方法實現子類繼承父類
         * @param  {function} child  子類建構函式
         * @param  {function} father 被繼承的父類建構函式
         */
        function inheritPrototype(child, father) {
            var prototype = object(father.prototype); //建立一個指定原型的物件
            prototype.constructor = child; //增強物件
            child.prototype = prototype; //子類的原型等於該物件
        }
        function father(name) {
            this.faName = 'father';
        }
        father.prototype.getfaName = function() {
            console.log(this.faName);
        };
        function child(args) {
            this.chName = 'child';
            father.apply(this,[]);
        }
        inheritPrototype(child, father); //子類的原型等於new 空函式(), 而new 空函式()出來的物件的原型等於父類的原型
        child.prototype.getchName = function() {
            console.log(this.chName);
        };
        console.log( child.prototype.isPrototypeOf(new child()) ); //true
        console.log(new child() instanceof child); //true
        /*
        優點:1.只調用一次父類的建構函式,避免了在子類原型上建立不必要的,多餘的屬性
              2.原型鏈保持不變
         */

相關推薦

js繼承各種繼承優缺點原型繼承組合繼承寄生組合繼承

</pre><pre name="code" class="javascript"> //1.原型鏈實現繼承 function father() { this.faName = 'father';

JavaScript之繼承原型

call() 的人 spa 環境 isp 而且 依賴 .html console   我們知道繼承是oo語言中不可缺少的一部分,對於JavaScript也是如此。一般的繼承有兩種方式:其一,接口繼承,只繼承方法的簽名;其二,實現繼承,繼承實際的方法。JavaScript不支

C++繼承、多型虛成員函式包括虛解構函式、虛複製建構函式學習筆記

通過哺乳類派生貓、狗等學習繼承、多型中的知識點 先貼上類的程式碼 #include<iostream> enum BREED { YORKIE, CAIRN, DANDIE, SHETLAND, DOBERAMN, LAB };//犬種 class Mam

FineUIPro/Mvc/Core/JS v4.2.0 釋出了老牌ASP.NET控制元件庫WebFormsASP.NET MVCCoreJavaScript

還記得 10 年前那個稍微青澀的 ExtAspNet 嗎,如今她已脫胎換骨,變成了如下 4 款產品: FineUIPro:基於jQuery的經典款ASP.NET WebForms控制元件,之前的FineUI(開源版)可以直接升級到此版本。 FineUIMvc:支援ASP.NET MVC5。 Fine

JS判斷字符串長度英文占1個字符中文漢字占2個字符

comment 大神 mar ews 人工 name 英文 智能 htm //計算字符串長度(英文占1個字符,中文漢字占2個字符) 方法一: String.prototype.gblen = function() { var len = 0;

js一些常用的校驗工作中用的較多的並附常用正則表示式

做web的經常會遇到一些js校驗,比如身份證呀,手機號呀,郵箱呀等等,分享下我工作中遇到的這些,整理了下 /* * 校驗是否為空(null/空串) */ var checkNull = function(str){ if(str == null || str ==

通過新浪雲部署Node.js微信小程序商城不用買域名、不用備案、不用配置https

個數 bre rem faq 開發 mem nbsp edi home 本文檔為微信小程序商城NideShop項目的安裝部署教程(GitHub),歡迎star 一、購買新浪雲SAE 為什麽選擇SAE?免費二級域名和支持https訪問,不用備案,可用做微信小程序服務器。 S

對功能的監控操作資訊記錄參考:本例是對使用者的操作記錄

package com.zc.spring.aop; import com.alibaba.fastjson.JSON; import com.zc.entity.sys.User; import com.zc.entity.sys.UserLog;

accept()函式用來告訴Qt事件處理函式“接收”了這個事件不要再傳遞;ignore()函式則告訴Qt事件處理函式“忽略”了這個事件需要繼續傳遞看一下QWidget::mousePressEvent的實現最為典型。如果希望忽略事件只要呼叫父類的響應函式即可

QEvent的accept()和ignore()一般不會用到,因為不如直接呼叫QWidget類的事件處理函式直接,而且作用是一樣的,見下面的例子。 推薦直接呼叫QWidget的事件處理函式。而不是呼叫accept()和ignore()。   只有一種情況下,必須使用呼叫accept()和ign

Mongodb 叢集加keyFile認證Mongodb使用者管理轉:http://blog.csdn.net/wlzjsj/article/details/61421230

介紹 自從遠古計繩結開始,資料庫的儲存就註定了今天的地位和多樣性,Nosql的出現更是解決了現有的關係型資料庫無法解決的一些難題,對高效能,靈活度,擴充套件性,海量資料的問題。隨之而出現的高速記憶體索引資料庫、列式儲存、影象儲存等等,這篇文章主要講的是mongodb文件型資料庫,mongodb目

nodejs備忘總結(一) -- node和express安裝與配置新建簡單專案附安裝配置過程中遇到問題的解決方法

安裝node 本文以安裝node_v8.9.0為例(win10環境),下載node-v8.9.0-x64.msi外掛 下載後,安裝,安裝目錄預設為C:\Program Files\nodejs 配置環境變數,系統變數->path,新增“C:\Program Files\nodejs\”

Linq 先進行分組在進行排序選取某一個人的最新的一條記錄

 var asd = from a in context.v_ydyl_execdrug                               group  new { a.drug_na

mac 電腦使用360應用加固開啟閃退mac系統版本10.13.6和10.12.x

應用在打包後,要用360加固,因開發使用mac下載360加固後,開啟後閃退,所以從網上查詢資料,發現大體有兩種方法; 1、開啟360加固助手----右鍵----顯示包內容----Contents----MacOS----JiaGuApp雙擊開啟,之後命令列執行一會,你的加固

warning: 遠端 HEAD 指向一個不存在的引用無法檢出warning: remote HEAD refers to nonexistent ref, unable to checkout

問題描述: 最近做Android開發,採用的是Git管理程式碼,從git伺服器上獲取Contacts模組的程式碼: git clone your-git-server 提示:warning: remote HEAD refers to nonexist

Hibernate查詢返回new物件注意這個新定義的類要有建構函式使用sql帶條件分頁查詢並且把結果顯示到一個物件的集裡面的解決方案

IIndexDaopackage com.ucap.netcheck.dao;import com.ucap.netcheck.combination.beans.IndexCombinationBean;import com.ucap.netcheck.common.P

2-sat問題輸出方案幾種方法趙爽的論文染色解法+其完全改進版淺析 / POJ3683

本文原創於  2014-02-12 09:26。 今複習之用,有新體會,故重新編輯。 2014-02-12 09:26: 2-sat之第二斬!昨天看了半天論文(趙爽的和俉昱的),終於看明白了!好激動有木有!終於理解了趙爽的每一句話!並且用了200+行程式碼實現,A了!具體過

動態獲取以太坊以太經典實時價格介面以及轉換匯率區塊

            WebRequest myWebRequest = WebRequest.Create("http://api.coindog.com/api/v1/currency/ranks");             WebResponse myWebRes

Gym - 101630L Laminar Family 剖分維護區間出現的段數

  解題思路:先把每個查詢的距離從大到小排序,然後我們再列舉查詢,這樣就不用考慮包含的情況了,因為小的肯定可以被大的包含,因此我們就只用考慮相交的情況了,關於相交,我們用區間染色的思想,然後查詢區間出現的顏色個數即可,我這裡用的是區間查詢顏色段數。 #include<

P4949 最短距離剖分+樹狀陣列+基環樹

傳送門 一箇中午啊…… 本來打算用仙人掌搞的,後來發現直接基環樹就可以了,把多出來的那條邊單獨記錄為\((dx,dy,dw)\),剩下的樹剖 然後最短路徑要麼直接樹上跑,要麼經過多出來的邊,分別討論就好了 因為這裡的樹剖只有單點修改和區間查詢,於是可以用樹狀陣列 //minamoto #include&l

101889I Imperial roads 剖分維護邊權最大值

題意:給你一個圖,然後Q個詢問,每個詢問,問強制要求使用某條邊的情況下的最小生成樹。 解題思路:先求最小生成樹,然後對於強制要求的邊,直接查詢樹上路徑最大值,然後減去這個最大值,再加上要求的邊的權值就是答案。 直接上樹鏈剖分即可。 #includ