【面向對象】用大白話扯扯那"神奇"的面向對象編程思維(二)

来源:https://www.cnblogs.com/sy11112027/archive/2019/04/20/10740949.html
-Advertisement-
Play Games

通過這張圖我們很明顯就可以看出了區別: 普通函數調用的時候this的指向是window 而構造函數調用的時候this的指向是這個對象 列印結果是:凡塵 18 為什麼會是一個false呢???如果你聽過凡塵老師講課的話,在ES6的一張說過一道面試題。 創建構造函數的時候js執行了那些操作? 1、在記憶體 ...


前言:
  上一章我們用大白話講解了一下麵向對象的編程思維,那麼這一張我們來講講如何用面向對象來書寫代碼。終於到了激動人心的時刻了.....

  傳送門:https://www.cnblogs.com/sy11112027/p/10740906.html 上一篇的地址
複製代碼
面向對象的三大特征:
  在瞭解了面向對象的編程思維後我們繼續瞭解下麵向對象的三大特征從而深刻的理解一下麵向對象

  抽象:抓住核心問題
      如何想描述一個人的時候我們應該如何去描述?用不用把這個人的每一個身體的器官,以及每一段經歷都書寫出來?那麼我敢說你要是想瞭解我的話,你至少的寫2本書才能把我
      描述出來,但是在我們面向對象的三大特征中的抽象就不需要這麼麻煩,你只需要知道我這個人的姓名,年齡,外貿,以及一些主要的信息就可以了。也就是說你只需要把問題
      的核心部分拿到手裡面就可以了,這就是所謂的抽象


  封裝:不考慮內部實現,只考慮功能使用
      當我們駕駛汽車的時候,是否要知道發動機的原理?
      當我們打開電視機的時候,是否要知道它的電路結構?
      當我們玩電腦的時候,是否要精通電腦的硬體組成?
      當我們打游戲的時候,是否必須明白程式的實現原理?
      其實以上一些問題我們都不需要去瞭解內部的一些構造,其實封裝也是如此:把一些功能封裝好,留一個用口 

  繼承:從已有的對象上繼承出新的對象
      說到繼承,不得不說下我自己,我一直以為我的家族是一個擁有億萬資產的龐大家族,而我現在所經歷的一切都是父親給我安排好的磨練,如今快過了小三十年了。我才發現我
      想多了,其實繼承最好理解就是你可以繼承你父親的遺產,或者你父親的一些面貌特征,編程也是如此

  多態:哈哈哈,你們很慶幸,因為javascript中沒有多態


好了瞭解完面向對象的三大特征,那麼下麵我們真的真的來看看面向對象是如何編寫代碼的
複製代碼 複製代碼
構造函數:
  首先我們先來聊一聊構造函數,等下?不是說要講如果用面向對象的思維來編寫代碼嗎?怎麼現在又扯到了構造函數?
  不要著急小伙子,我們一步一步來,因為面向對象的編程風格都是從一個關鍵字 new 開始的

什麼是構造函數?
  通過new 調用的函數 叫做構造函數

  在講構造函數的時候我們先來想一個問題,如何創建一個對象?聽到這個問題有些同學就安奈不住自己拿躁動的小心靈了,這還不簡單?
  var obj = new Object();
  var obj = Object();
  var obj = {};
  
  好既然這麼厲害,那我的要求再次升級,能不能用你知道的對象給我描述一個人?這是時候你又安奈不住你幼小的心靈了!!!
  var obj = {
      name:"凡塵",
      age:"18",
      sex:"帥哥",
      show:function(){
        console.log("凡塵是個大帥哥")
      }
    }

  是不是感覺分分鐘就寫完了?那麼好,我的需求在此升級,你給我描述10個人的信息!!!這時候你是不是就開始複製粘貼了?然後粘貼了滿屏的代碼?這又是何苦呢?
  難到我們就不能封裝一個嗎?

  function person(name,age,sex){
    
    var obj = new Object();
  
    obj.name = name;
    obj.age = age;
    obj.sex = sex;

    obj.showName = function(){
      console.log("我的名字叫"+this.name)
    }

    obj.showAge = function(){
      console.log("我的年齡"+this.age)
    }

    return obj;
  }
  -----------------------------------------------------------------------------------------------------------------------------------------------
  這時候你是不是感覺你又行了?感覺你特別厲害了?其實這種方式其實就是一個工廠函數,我們可以逐步的接下一下
 function person(name,age,sex){
    //原料
    var obj = new Object();
    //加工
    obj.name = name;
    obj.age = age;
    obj.sex = sex;

    obj.showName = function(){
      console.log("我的名字叫"+this.name)
    }

    obj.showAge = function(){
      console.log("我的年齡"+this.age)
    }
    //出廠
    return obj;
  }
這時候是不是問題就完美的解決掉了呢?不不不,問題才剛剛開始,因為我剛纔說過了面向對象的編程風格都是從一個關鍵字 new 開始的 很明顯我們在調用這個函數的時候根本沒有用到
new這個關鍵字。

那麼問題又來了,為什麼非要扯上這個new 難到沒有這個new就不行嗎?不要急躁我們一步一步來

首先我們把問題列出來看看問題在哪?

  1、在調用這個函數的時候我們沒有用 new 而new這個關鍵字在函數的內部使用了。那麼我們能不能把這個new給拿出來?

  2、上面的慄子中有一個showName方法。那麼每次調用這個方法的時候showName方法是否為同一個方法?
    如:var b1 = person(name,age,sex); var b2 = person(name,age,sex);
      alert(b1.showName == b2.showName)//false

既然問題列出來了,那麼我們就去解決這2個問題
 

複製代碼


複製代碼
  1、在調用這個函數的時候我們沒有用 new 而new這個關鍵字在函數的內部使用了。那麼我們能不能把這個new給拿出來?

  問題一:
    為什麼我非要在調用函數的時候要加一個new呢?好我來解決下這個問題

   

 

    通過這張圖我們很明顯就可以看出了區別:

      普通函數調用的時候this的指向是window  而構造函數調用的時候this的指向是這個對象

      普通函數沒有return的時候返回值是undefined  而構造函數的返回值想自己本身這個對象 

   為什麼構造函數沒有return卻能夠有返回值呢?
      因為構造函數在調用的時候系統內部自動return出了一個this,而這個this就是指的這個對象
 

   現在我們知道了調用函數的時候加new 和不加new的區別了那我們就來改上面的代碼!
    

  

 

列印結果是:凡塵   18

 

 好累啊!!!!終於解決完第一個問題了,那麼我們繼續來解決第二個問題
複製代碼

 

複製代碼
 2、上面的慄子中有一個showName方法。那麼每次調用這個方法的時候showName方法是否為同一個方法?

  我們先來驗證一下是否為同一個方法

為什麼會是一個false呢???如果你聽過凡塵老師講課的話,在ES6的一張說過一道面試題。

創建構造函數的時候js執行了那些操作?

1、在記憶體中開闢了一塊空間   2、把this的指向指向了它   因為new一次就會開闢一塊空間,你還指望他們相等嗎?就相當於你蓋了一個房子,然後買了一個100英寸的電視,然後你發小也蓋了一個房子,然後也買了一個100英寸的電視,你難到能說他加的 電視就是你家的電視嗎?

既然知道了問題的所在那麼我們就去解決這個問題。接下來我們在去扯扯數組

 

我們都知道數組有好多方法共我們使用,例如 push  pop  shift.....那麼數組有沒有一種去重的方法共我們使用呢?例如就叫norepeat?

不用試也應該知道根本沒有這個方法。那麼我們可不可以給數組加上這個方法呢?當然可以,首先我們要先知道push  pop  shift....等這些東西在數組的哪裡放著。接下來我們學習一個

新的東西叫原型----prototype

 

我們在頁面上輸出這樣一句話,Array代表數組,也就是說來看下數組的原型。我看可以看下列印出來了什麼東西;

 

 你會發現你找到了一個窩點,裡面有好多我們熟悉的方法。那麼我就可以肯定數組的那麼方法是加在原型上面的。那麼我們接下來就給數組添加一個norepeat方法

 

那麼別的數組可以使用這個方法嗎?他們這個方法是一樣的嗎?接下來我們去驗證這個問題!!!!

經過驗證準確無誤!!!大功告成,這樣我們終於把這兩個問題解決完了,那麼我們在從新寫下我們最開始的那個工廠函數

 

終於完成了!!!!碼字碼的好辛苦!!!等這不是說帶我們用面向對象的思維寫代碼嗎?怎麼就結束了呢?

其實上面的過程和步驟就是利用面向對象的思維去寫的,我們稍微總結一波你們就懂了

  1、以前我們的全局變數都是為一個人進行服務的,但是現在我們把變數變成了屬性,面向對象就可以對所有的人進行服務,而且全局變數會讓你的程式變的特別慢,其實你也可以理解成
    婚前誰也不屬於誰,但是婚後你就只屬於對方了

  2、我們把所有的函數都加在了對象的原型上面,其實就相當於就每一個方法分割成了不同的模塊。這個正好就是我們面向對象的編程思維


截止到目前為止除了面向對象的繼承沒有講到以外,其他的應該都已經說到了。如何你能接受這個兩篇文章那麼你就能用面向對象的思維去編寫程式了!!!



具體如何用 面向對象寫程式呢?我大致分為以下幾個步驟

  1、把面向過程的程式,改寫成面向對象的形式     2、改寫成面向對象的幾個條件        a、所有的東西寫在onload裡面          b、不能有函數嵌套,可以有全局變數   3、 全局變數---》屬性     函數---方法    onload ====構造函數     4、改錯

後面我會帶大家寫幾個面向對象的案例,今天就到此結束吧,太累了!!!!親記得給個5星好評

【註】:如需轉載請註明出處,碼字不容易!請理解----如有不同理解,請大神多多指點
【註】:轉載至Alley-巷子的作品,強烈推薦,一名大牛級別的導師!
傳送門:http://www.cnblogs.com/nanianqiming/p/7711496.html

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

-Advertisement-
Play Games
更多相關文章
  • 在我們平時生活當中,經常會看到一些表白女朋友的html網頁,但是Android端的表白軟體可以說是基本沒有,筆者在全網搜了一下,就沒有一個可以用的。安卓端可以給人一種定製和精美的感覺,這是網頁所做不到的,網頁鏈接不見了就沒了。因此在這裡將自己寫的Android軟體製作流程以及代碼全部開源,這裡採用了 ...
  • 寫在前面: 網上有各種富文本編輯器,微博分享等操作,這些功能非常實用,他們就是使用 range,selection 對象來實現的,這兩個對象偏冷門,不涉及編輯器一般用不到,range 對象是對選區的操作,選區是滑鼠在頁面上按下,然後拖動選擇的內容,range 對象就是對這個選區的操作;selecti ...
  • 應用場景 在前端開發的過程中,時常有這樣的一個需求,需要將某個組件,展示在不同的頁面中。常見的有,頭部菜單欄、底部版權,如下圖中的菜單,就需要在不同頁面中進行顯示。 解決方法 假設有這樣一個需求,希望把下麵的這個頭部菜單在 Home 和 About 這兩個頁面中顯示 在頁面中,引入公共組件 在需要顯 ...
  • 一、安裝Node.js (以下安裝環境均為win10) 下載鏈接:https://nodejs.org/en/download/ 官網給出了兩個版本,LTS和Curren。字面意思是推薦大多數用戶使用LTS版本,而Current版本則是含有最新功能,百度了下LTS是長期維護版本,沒有特殊要求這裡就下 ...
  • 對於函數的使用,和對函數的參數和返回值的理解,給出了一些例題,以便理解! ...
  • 四、精簡提煉 我們的播放器基本實現了,但是代碼復用不高,所以我們要進行封裝,以插件的形式體現。 1.插件的基本運行代碼如下: 上述代碼就是基本的插件代碼,下麵詳細記錄這段代碼所表示的意思。 前面的分號,可以解決插件與其它js合併時,別的代碼可能會產生的錯誤問題; “(function(){})()” ...
  • inside the <body> tags, using a "wrapper" div to control the whole section. HTML: <div id="wrapper"> (content) </div> CSS: #wrapper { ... margin: 0 au ...
  • **Git安裝以及常用命令** 1、下載安裝Git,傻瓜式安裝相信大家都會。 官網下載地址:[https://git-scm.com/downloads] 2、Git基本操作 (1)git --version(查看git版本) (2)git --help(輔助命令查看) (3) git config ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...