主頁 > 企業開發 > WEB前端第三十八課——js類和物件,繼承,設計模式

WEB前端第三十八課——js類和物件,繼承,設計模式

2020-09-10 05:03:03 企業開發

1.基礎

  類,是一種抽象的,并不實際存在的,表示一種事物共有特征的描述

  物件,是具體的,實際存在的,類中的某一個體

  JavaScript是一個典型的“面向程序思想”的語言,語言中不存在類和物件的概念,

  但是,由于JavaScript經常要解決“面向物件思想”的問題,所以JavaScript使用一些方法模擬面向物件思想的特征,

 2.類的創建

  建構式,通過 new命令生成物件的函式稱為建構式,建構式一般首字母大寫

  new命令的作用是先創建一個物件,然后讓物件呼叫建構式,因此,建構式中的 this指向的是 new創建的物件

  語法示例:

    function Student(name, age, sex){

      this .name=name;

      this .age=age;

      this .sex=sex;

    };

    var Lili = new Student('Lili', 20, 'female');

  上述代碼中,函式 Student代表類名,通過傳遞實參向類的屬性賦值,new命令將這些鍵值對構造為物件,然后賦值給變數

  注意,這種方法只是 js中眾多創建類的方式之一,且并不是最優的創建方式

3.面向物件思想

  面向物件(oop),創建一個物件,讓物件擁有做某件事的能力(給物件屬性和方法),然后命令物件做某件事(封裝、繼承、多型)

  面向程序(pop),分析出解決問題的所有步驟,將其構建為一個一個函式,然后將這些步驟按照一定順序實作(順序、選擇、回圈)

  oop的核心就是如何構建一個物件,也就是“物件的封裝”!

4.封裝

  是指構造具有某種特征的類,以通過對其進行實體化,來獲得滿足需求的物件的程序

  封裝的特征:

    公有,物件中的屬性和方法,在物件外部能夠直接訪問的,稱為公有屬性和方法

    私有,物件中的屬性和方法,僅在物件內部才可以使用的,稱為私有屬性和方法

  在建構式中,通過“this .屬性”的方式為類添加公有的屬性和方法

    this.property所添加的內容在物件外部能夠直接被訪問

  在建構式中,添加區域變數和閉包的方式為類添加私有的屬性和方法

    區域變數保證了物件外部無法直接獲取,閉包保證了物件外部可以間接獲取

  對于所有物件都具有的共同屬性,為了減少在構造物件時重復傳遞相同屬性值,通過 prototype屬性進行統一定義

    語法:類名 .prototype .相同屬性值的屬性 = 屬性值;

5.原型

  js中給函式提供了一個物件型別的屬性,叫作 prototype(原型)

  原型歸函式所有,不用創建,是默認就存在的

    語法:Class .prototype .property = ' value ';

  注意,js中提供了一種機制,如果是通過類創建的物件,當訪問的屬性在物件中沒有找到時,

     會去找創建這個物件的類的原型屬性,如果能找到,則視為當前物件擁有這個屬性,

  本質上,原型的存在就是為了給類的物件添加共同的屬性

  作用,使用原型能夠有效地節約記憶體空間,通過原型創建的屬性和方法,能夠被所有這個類創建的物件訪問

6.建構式語法小結

  function  ClassName(para1,para2,...) {    //類名首字母須大寫
   var privateProperty = 'value';      //定義私有屬性
   var privateFunc = function () { }      //定義私有方法
   this.publicProperty1 = para1;      //定義公有屬性
   this.publicProperty2 = para2;
    
this.publicFunc = function(){ };      //定義公有方法(特權函式,可以讀寫privateProperty)
      ... ...
  }
  ClassName.prototype.publicProperty3 = 'value3';  //定義原型(共有)屬性及屬性值
  ClassName.prototype.publicFunc=function () { };   //定義原型(共有)方法

   var  obj = new  ClassName(實參1,實參2,…);    //通過類創建物件

7.原型屬性

  結構:原型是一個物件,在原型中通常有兩個屬性

    ① 構造器Constructor,該屬性指向了這個類本身(表明當前原型歸屬于哪個類所有)

    ② 原型指向_proto_,該屬性指向原型本身,提供給通過類創建的物件使用

  作用:創建類的公有屬性和公有方法,為創建物件服務

     節約記憶體空間,不必為每一個物件都分配公有屬性和公有方法的記憶體

  缺點:原型中不能保存陣列這類參考型別的資料

     因為地址傳遞的問題會導致出現修改的連鎖變化

     比如,通過 obj .publicProperty .pop(); 洗掉共有屬性陣列中的元素,

        會導致其他物件訪問 prototype .publicProperty 陣列時也缺少了這個元素

8.原型鏈

  原型鏈構成,由物件的“_proto_”屬性和物件的建構式的原型的“_proto_”屬性構成的鏈式結構稱為原型鏈

        原型鏈的頂端是 Object物件,Object物件沒有“_proto_”屬性,或者說它的“_proto_”屬性指向了自身

  原型鏈作用,訪問物件的屬性或方法時,首先在物件本身中查找是否擁有這個屬性或方法,

        如果沒有找到,那么就沿著原型鏈逐級向上查找,直到 Object為止

        在任何一級尋找到這個屬性或方法都視為物件擁有這個屬性或方法(繼承)

  原型鏈創建,函式的原型(prototype) 設定為 另一個函式的物件(實體)

        語法示例:ClassName101 .prototype = new  ClassName1 ;

9.繼承

  在面向物件的語言中,子類能夠在不宣告的情況下,使用父類的屬性和方法的特性叫作繼承

  而JavaScript語言本質上并不是一門面向物件的語言,所以,需要通過某種手段來模擬繼承,這個方法就是“原型鏈”

  鏈式繼承示例:

<script>
    function RichMan() {}
    RichMan.prototype.money='billions of pounds';
    var father=new RichMan();   //創建父類的實體化物件

    function Son() {}
    Son.prototype=father;       //創建子類繼承關系
    
    var boy=new Son();          //創建子類實體化物件
    console.log(boy.money);     //billions of pounds
</script>

  存在的問題:

    ① 原型鏈繼承,子類實體化不能向父類建構式傳參,但是可以直接訪問父類的原型屬性

     構造繼承,只能訪問到父類實體屬性,實體化時可以向父類建構式傳參,但是不能訪問父類的原型屬性和方法

    ② 原型鏈繼承,子類 prototype的 constructor屬性,實際上就是父類 prototype的 constructor屬性,這樣并不合理

     建構式,子類 prototype的 constructor屬性是子類本身,父類也是同樣,但構造繼承的子類無法享有父類的prototype屬性和方法

  構造繼承示例:

    function RichMan(fcash,fhouse,fcar) {
        this.cash=fcash;
        this.house=fhouse;
        this.car=fcar;
    }
/*    RichMan.prototype.money='billions of pounds';
    var father=new RichMan();   //創建父類的實體化物件*/

    function Son(scash,shouse,scar) {
        RichMan.call(this,scash,shouse,scar);      //創建子類構造繼承關系
    }
    var john=new Son(1,2,3);        //可以訪問父類實體屬性,but not 原型屬性
    var dancy=new Son(4,5,6);

10.組合繼承

  為了解決“原型鏈繼承”和“構造繼承”的各自缺點,在創建子類繼承時同時使用兩種繼承方式,即組合繼承

 1 <script>
 2     function RichMan(fcash,fhouse,fcar) {
 3         this.cash=fcash;
 4         this.house=fhouse;
 5         this.car=fcar;
 6     }
 7     RichMan.prototype.money='billions of pounds';
 8     // var father=new RichMan();   //創建父類的實體化物件
 9 
10     function Son(scash,shouse,scar) {
11         RichMan.call(this,scash,shouse,scar);   //創建“構造繼承”關系
12     }
13     Son.prototype=new RichMan();        //創建“鏈式繼承”關系
14     var john=new Son(1,2,3);
15     var dancy=new Son(4,5,6);
16     console.log(john);                 //Son {cash: 1, house: 2, car: 3}
17     console.log(dancy.money);          //billions of pounds
18 
19 /*    Son.prototype=father;       //創建子類繼承關系
20     var boy=new Son();          //創建子類實體化物件
21     console.log(boy.money);     //billions of pounds*/
22 </script>

  組合繼承的弊端:

    在子類中呼叫了兩次父類建構式,一次用于構造繼承,一次用于鏈式繼承,也就是對實體屬性初始化了兩次,

    但這一弊端不太致命,子類在實體化時,構造繼承的實體屬性覆寫了鏈式繼承的實體屬性,只是多消耗了一些記憶體

  寄生組合繼承

    核心思想:通過寄生方式,砍掉父類的實體屬性,這樣就能在呼叫兩次父類的構造的時候,不會再次實體屬性/方法, 

 1 <html lang="en">
 2 <head>
 3     <meta charset="UTF-8">
 4     <title>繼承</title>
 5 </head>
 6 <body>
 7 
 8 <script>
 9     function RichMan(fcash,fhouse,fcar) {
10         this.cash=fcash;
11         this.house=fhouse;
12         this.car=fcar;
13     }
14     RichMan.prototype.money='billions of pounds';
15     // var father=new RichMan();   //創建父類的實體化物件
16 
17     function Son(scash,shouse,scar) {
18         RichMan.call(this,scash,shouse,scar);   //創建子類“構造繼承”關系
19     }
20     // Son.prototype=new RichMan();       //創建“鏈式繼承”關系
21     Son.prototype.constructor=Son;        //將子類原型屬性‘constructor’指向子類本身!
22 
23     (function () {                     //創建自執行函式,并嵌套一個空的建構式 Medi,
24         function Medi() { }             //將空建構式插入到原型鏈作為中間節點,即原子類變為孫類
25         Medi.prototype=new RichMan();   //這樣就避免在每一次子(孫)類實體化時進行兩次父類實體化屬性和方法
26         Son.prototype=new Medi();       //也就是用這種寄生方式替代原來的直接“鏈式繼承”關系
27     }());
28 
29     var john=new Son(1,2,3);
30     var dancy=new Son(4,5,6);
31     console.log(john);                 //Son {cash: 1, house: 2, car: 3}
32     console.log(dancy.money);          //billions of pounds
33 
34 /*    Son.prototype=father;       //創建子類繼承關系
35     var boy=new Son();          //創建子類實體化物件
36     console.log(boy.money);     //billions of pounds*/
37 </script>
38 </body>
39 </html>

 

11.設計模式

  設計模式(Design Pattern)是一套被反復使用的、多數人知曉的、經過分類的代碼設計經驗的總結(模板)

  作用:提高代碼可重用性、讓代碼更容易被他人理解、提高代碼的可靠性,

     設計模式使代碼撰寫真正工程化,是軟體工程的基石脈絡,如同大廈的結構一樣

  常見種類:

    ① 工廠模式

    ② 建構式模式

    ③ 原型模式

    ④ 混合模式

    ⑤ 動態原型模式

12.工廠模式

    <script>
        function RichMan(fcash,fhouse,fcar) {
            var richMan={};             //定義區域變數,型別為Object物件
            richMan.cash=fcash;         //直接定義內部物件的屬性
            richMan.house=fhouse;
            richMan.car=fcar;
            return richMan;             //將內部物件作為呼叫函式的回傳值
        }
        var man=RichMan('muchCash','bigHouse','luxuryCar');
        console.log(man);
        console.log(man instanceof RichMan);        //回傳值為 false
    </script>

  工廠模式是軟體開發中經常被使用的一種設計模式

  instanceof 方法一個實體是否歸屬于一個類,

  通過工廠模式創建的物件,最大的問題是無法確定其屬于哪一個類!

13.建構式模式

    <script>
        function RichMan(fcash,fhouse,fcar) {
            this.cash=fcash;         //定義this屬性
            this.house=fhouse;
            this.car=fcar;
        }
        //通過 new命令創建物件
        var man=new RichMan('muchCash','bigHouse','luxuryCar');
        console.log(man);
        console.log(man instanceof RichMan);        //回傳值為 true
    </script>

  建構式和工廠模式最大的區別是:

    沒有顯示創建一個物件,而是通過 new命令隱式創建一個物件

    然后讓隱式物件來實際執行建構式,因此建構式中的 this指向的是這個隱式物件

  通過建構式創建的物件可以明確判斷其歸屬于哪一個類

  建構式創建物件必須使用 new命令,函式名的首字母通常大寫

  建構式模式最大的問題是面對子類物件共有的屬性值,不能有效地節約記憶體占用!

14.原型模式

    <script>
        function RichMan(fcash,fhouse,fcar) {}
        //使用 prototype方法定義類的共有屬性
        RichMan.prototype.cash='muchCash';
        RichMan.prototype.house='bigHouse';
        RichMan.prototype.car='luxuryCar';
        //通過 new命令創建物件
        var man=new RichMan();
        man.house='manyHouse';  //對于相同屬性不同屬性值時單獨賦值
        console.log(man);
        console.log(man instanceof RichMan);        //回傳值為 true
    </script>

  弊端:在處理不同屬性值的公有屬性時,增加了記憶體的空間占用!

15.混合模式

    <script>
        function RichMan(fcash,fhouse,fcar) {
            this.cash=fcash; 
            this.house=fhouse;
            this.car=fcar;
        }
        RichMan.prototype.advantage=function () {
            console.log('數錢數到手抽筋')
        }
        //通過 new命令創建物件
        var man=new RichMan('muchCash','bigHouse','luxuryCar');
        console.log(man);
        man.advantage();
    </script>

16.動態原型模式

    <script>
        function RichMan(fcash,fhouse,fcar) {
            this.cash=fcash;
            this.house=fhouse;
            this.car=fcar;
            //使用“懶加載”的方式,定義共有屬性的原型
            if (typeof RichMan._initialized=='undefined'){
                RichMan.prototype.advantage=function () {
                    console.log('數錢數到手抽筋')
                }
                RichMan._initialized=true;
            }
        }
        //通過 new命令創建物件
        var man=new RichMan('muchCash','bigHouse','luxuryCar');
        console.log(man);
        man.advantage();
    </script>

  懶加載:使用時才加載和占用記憶體空間,在沒有使用之前相當于不存在

  動態原型模式和混合模式很相似,二者都是為了解決原型模式中所有內容都公有的問題

  動態原型模式的特點在于,

    通過判斷一個類的 “._initialized” 屬性的型別(typeof),進而判斷這個類有沒有被實體化過,

    如果沒有被實體化過,在第一次呼叫(初始化)時就會將其釋放,并將屬性值寫為 true,

  “._initialized”屬性是每一個類都擁有的私有屬性,它僅用來表示類是否被實體化過,是Boolean型別的可讀寫屬性,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/943.html

標籤:JavaScript

上一篇:基于原生JS封裝的Modal對話框插件

下一篇:蒲公英 &#183; JELLY技術周刊 Vol.21 -- 技術周刊 &#183; React Hooks vs Vue 3 + Composition API

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more