js 繼承

来源:http://www.cnblogs.com/xiaoxiaokun/archive/2017/07/16/7191685.html
-Advertisement-
Play Games

今天看的《JavaScript設計模式》-作者:張容銘。主要看了js繼承。下麵我將看的,以及代碼貼出來,跟大家一起學習,分享。共同進步。 先來個簡單是 單繼承 多繼承 類繼承 是通過子類的原型prototype對父類實例化來實現的 缺點:父類中的共有屬性如果是引用類型就會在子類的所有實例中共擁有,一 ...


    今天看的《JavaScript設計模式》-作者:張容銘。主要看了js繼承。下麵我將看的,以及代碼貼出來,跟大家一起學習,分享。共同進步。

   先來個簡單是

  單繼承

   

//單繼承

var extend=function(target,source){
    //遍歷原對象的所有屬性
    for(var i in source){
        //將原對象中的屬性複製到目標對象中
        target[i]=source[i];
    }
    //返回目標對象
    return target;
    //這是淺拷貝
}

多繼承

       

//多繼承

var mix=function(){
    
    var i=1;//從第二個參數開始
    var arg;//緩存arguments參數
    var len=arguments.length;//參數長度
    var target=arguments[0];
    for(;i<len;i++){
        arg=arguments[i];
        //遍歷原對象的所有屬性
        for(var a in arg){
            //將原對象中的屬性複製到目標對象中
            target[a]=arg[a];
        }
    }
    
    //返回目標對象
    return target;
    //這是多對象淺拷貝(data,ds,de);會把ds,de的各個屬性方法拷貝到data,不好之處,有可能ds的屬性會被de的屬性覆蓋
}

類繼承
   是通過子類的原型prototype對父類實例化來實現的
   缺點:父類中的共有屬性如果是引用類型就會在子類的所有實例中共擁有,一旦被某一個實例改變,則父類中的共有屬性改變。

 

        //聲明
        function SuperClass(){
            //共有屬性--如果是引用類型(數組,對象)就會有問題
            this.superValue=true;
        }
        //為父類添加共有方法
        SuperClass.prototype.getSuperValue=function(){
            return this.superValue;
        }
        //聲明子類
        function SubClass(){
            this.subValue=false;
        }
        //繼承父類
        SubClass.prototype=new SuperClass;
        //為子類添加共有方法
        SubClass.prototype.getSubValue=function(){
            return this.subValue;
        }
        
        var instan=new SubClass;
        console.log(instan.getSuperValue());
        console.log(instan.getSubValue());

構造函數繼承
    在子類的構造函數作用環境中執行一次父類的構造函數來實現
    缺點:父類原型無法被繼承,是通過call改變函數作用域實現的

        //聲明
        function SuperClass(id){
            //共有屬性--如果是引用類型(數組,對象)就會有問題
            this.books=["a","b","c"];
            this.id=id;
        }
         //為父類添加共有方法
        SuperClass.prototype.showbooks=function(){
            console.log(this.books);
        }
         //聲明子類
        function SubClass(id){
            SuperClass.call(this,id);
        }
        //為子類添加共有方法
        SubClass.prototype.conso=function(){
            console.log("SubClass");
        }
        var instace1=new SubClass(10);
        var instace2=new SubClass(11);
        instace1.books.push("d");
        console.log(instace1.books);
        console.log(instace1.id);
        console.log(instace2.books);
        console.log(instace2.id);
        console.log(instace2.showbooks);//父類原型無法被繼承

組合式繼承
   把類繼承與構造函數組合起來。
   缺點:父類構造函數執行兩遍

       //聲明
        function SuperClass(id){
            //共有屬性--如果是引用類型(數組,對象)就會有問題
            this.books=["a","b","c"];
            this.id=id;
        }
         //為父類添加共有方法
        SuperClass.prototype.showbooks=function(){
            console.log(this.books);
        }
         //聲明子類
        function SubClass(id,name){
            SuperClass.call(this,id);
            this.name=name;
        }
        //類式繼承 子類原型繼承父類
        SubClass.prototype=new SuperClass();
        //為子類添加共有方法
        SubClass.prototype.getName=function(){
            console.log(this.name);
        }
        var instace1=new SubClass(10,"SubClass10");
        var instace2=new SubClass(11,"SubClass11");
        instace1.books.push("d");
        console.log(instace1.books);
        console.log(instace1.id);
        console.log(instace1.getName());
        console.log(instace2.books);
        console.log(instace2.id);
        console.log(instace2.getName());

原型式繼承
   對類繼承進行封裝,過渡對象相當於類繼承的子類,只不過在原型式中作為過渡對象出現。
   缺點:類繼承的缺點

       //原型式繼承
       function createObj(o){
               //聲明一個過渡對象
               function F(){};
               //過渡對象原型繼承o
               F.prototype=o;
               //返回一個新的過渡對象實例
               return new F();
       }
       
       var obj={
              name:"js book",
              alickbooks:["css book","html book"]
       }
       
        var book_a=createObj(obj);
        book_a.name="book_a";
        book_a.alickbooks.push("book_a");
        console.log(book_a.alickbooks);
        
        var book_b=createObj(obj);
        book_b.name="book_b";
        book_b.alickbooks.push("book_b");
        console.log(book_a.alickbooks);

寄生式繼承
   就是對原型式繼承的第二次封裝,並且在這第二次封裝的時候對繼承的對象進行擴展,
   這樣新創建的對象不僅有父類的屬性方法也有自己擴展的屬性與方法。
   缺點:類繼承的缺點

      //寄生式繼承
       function createObj(o){
               //聲明一個過渡對象
               function F(){};
               //過渡對象原型繼承o
               F.prototype=o;
               //返回一個新的過渡對象實例
               return new F();
       }
       
       var obj={
              name:"js book",
              alickbooks:["css book","html book"]
       }
       
        function createBook(obj){
            //通過原型繼承方式創建對象
            var o=new createObj(obj);//這個new要與不要是一樣的
            //拓展新方法
            o.getname=function(){
                console.log(name);
            }
            
            //返回拓展後的新對象
            return o;
        }
       
        var book_a=createBook(obj);
        book_a.name="book_a";
        book_a.alickbooks.push("book_a");
        console.log(book_a.alickbooks);
        
        var book_b=createBook(obj);
        book_b.name="book_b";
        book_b.alickbooks.push("book_b");
        console.log(book_a.alickbooks);

寄生組合式繼承

 

       //寄生式繼承
       function createObj(o){
               //聲明一個過渡對象
               function F(){};
               //過渡對象原型繼承o
               F.prototype = o;
               //返回一個新的過渡對象實例
               return new F();
       }
        
        // 
        // 寄生式繼承 繼承原型
        // 傳遞參數   subClass   子類
        // 傳遞參數   superClass 父類
        //
       function inheritPrototype(subClass,superClass){
               //複製一份父類的原型副本保存在變數中
               var p = createObj(superClass.prototype);
               //修正因為重寫子類原型導致子類的constructor;
               p.constructor = subClass;
               //設置子類的原型
               subClass.prototype=p;
       }
        
         //定義父類
        function SuperClass(name){
            //共有屬性
            this.colors = ["red","blue","green"];
            this.name = name;
        }
         //為父類添加共有方法
        SuperClass.prototype.getName = function(){
            console.log(this.name);
        }
         //定義子類
        function SubClass(name,time){
            //構造函數式繼承
            SuperClass.call(this,name);
            //子類新增屬性
            this.time = time;
        }
        //寄生式繼承父類原型
        inheritPrototype(SubClass,SuperClass);
        //子類原型新增原型方法
        SubClass.prototype.getTime = function(){
            console.log(this.time);
        };
        //創建兩個測試方法
        
        var instace1 = new SubClass("js book",2014);
        var instace2 = new SubClass("css book",2013);
        instace1.colors.push("black");
        console.log(instace1.colors);
        console.log(instace2.colors);
        
        console.log(instace1.getTime());
        console.log(instace2.getTime());
        
        console.log(instace1.getName());
        console.log(instace2.getName());

  總結:這篇文章是參考學習的,所有呢,代碼中都有註釋,希望能夠對大家有用。也同時希望大家在休息之餘不要忘記學習。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 函數要短。短才方便閱讀、維護和設計。 函數只做一件事。依照單一職責原則(一個類只會因為一個原因改變)設計函數。一個函數要麼進行流程式控制制或邏輯判斷,要麼改變某事物的狀態,要麼計算並返回結果,要麼調用多個下一抽象級的其他函數(另一種流程式控制制而已)。不要有多餘功能。 我們可以把函數分解成多個抽象層級來設計 ...
  • 0.代碼概述 代碼說明:第一章中的代碼為了突出模塊化拆分的必要性,所以db採用了真實操作。下麵代碼中dao層使用了列印日誌模擬插入db的方法,方便所有人運行demo。 1.項目代碼地址:https://github.com/kingszelda/SpringAopPractice 2.結構化拆分,代 ...
  • 題外,Chrome最近在耗電量方面超過了Edge,不過記憶體占用還是高啊,開發時偶爾用用。這不,http://jqueryui.com/menu/的官方菜單都支持的不好,改改吧! 打開jquery-ui.css 找到.ui-menu .ui-menu-item項 註釋/刪除掉list-style-im ...
  • 今天在切圖的時候,碰到一個相容性的問題,很幸運最後通過張金鑫老師的文章解決了這個問題!但在閱讀張老師文章的時候,我有個地方不明白,在網上查了下也沒找到我想要的答案,後來自己想了半天好像是這麼回事,現在我把我的想法寫出來,如果有不對的地方,大家一定要指出哦。 如圖(事例1): 這是張老師文章中的一段事 ...
  • 一 概述 1.什麼是HTML? HyperText Markup Language,超文本標記語言,客戶端技術的技術,負責頁面展示。 2.HTML的特點 標簽不區分大小寫。 3.請求地址 HTML是客戶端技術的基礎,HTML運行在客戶端,面向整個互聯網,為了能夠保證正確地定位資源,在書寫請求地址時, ...
  • 2016年10月我參加了在北京舉行的DevDays Asia 2016 - Office 365應用開發”48小時黑客馬拉松“,我開發的一個Word Add-In Demo——WordTemplateHelper獲得了二等獎。在會場有幸結識了陳希章老師,在與陳老師的交流中受益良多,得知陳老師在準備一 ...
  • yahoo軍規一共分7類共35條: 1.儘量減少HTTP請求數 分類: 內容 80%的終端用戶響應時間都花在了前端上,其中大部分時間都在下載頁面上的各種組件:圖片,樣式表,腳本,Flash等等。減少組件數必然能夠減少頁面提交的HTTP請求數。這是讓頁面更快的關鍵。 減少頁面組件數的一種方式是簡化頁面 ...
  • 具體代碼如下: <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title><style>*{margin:0;padding:0;font-size:14px;-webkit-user-sele ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...