面向對象


 類的概念
  類是對對象的一種歸納,而對象是類的一種具體實現
 對象的分類
  原生對象
   原生對象又能夠分爲兩類
    內置對象
     列如前面學習過的Date、Math、正則、數組等,這些就是典型的內置對象。它們是JavaScript這門語言自己所內置的,咱們直接使用便可
    自定義對象
     自定義對象是咱們開發人員本身定遠的對象,列如在JS基礎中介紹符的使用{}快速生成對象。這樣的對象就能夠被稱之爲自定義對象
  宿主對象
   顧名思義,就是依存於某一個特定的環境纔會有的對象,一旦離開了特定的環境,則這些對象將不存在。列如前面咱們在講解DOM編程時介紹過的window、navigator、history等對象,這些都是依賴於瀏覽器環境的。一旦脫離瀏覽器環境,這些對象也就不存在了。
  原型對象
   在JavaScript裏面,沒有類這個概念,只有原型的概念。在JavaScript裏面的每個對象,都有一個原型對象,而原型對象上面也有一個本身的原型對象,一層一層向上找,最終到達null。
   經過上面的圖咱們能夠得出如下結論
    每個對象都有一個原型對象。咱們能夠經過__proto__來訪問到某個對象的原型對象
    經過__proto__一直向上尋找原型對象的話,最終會找到null
    一個構造函數prototype屬性指向一個對象,兒這個對象是經過該構造函數實挒化出來的對象的原型對象
    JavaScript中的Object.prototype對象。Object.prototype對象是一個空對象,JavaScript中遇到的每一個對象,實際上都是從Object.prototype對象克隆而來的。Object.prototype對象就是它們的原型。而Object.prototype對象的原型爲null。
 類與對象的建立
  構造函數
   JavaScript是一門很特殊的語言,在ES6以前都沒有類的概念,而是經過構造函數老模擬其餘編程語言裏面的類的。構造函數實際上也是函數,不過這種函數是專門用於生產對象的,因此被稱之爲構造函數。它的外表和普通函數如出一轍,區別在於被調用的方式上面。
   構造函數的函數名又一個不成文的規定,就是首字母要大寫,以便和普通函數進行區分。
   用new運算符調用函數時,該函數總會返回一個對象,一般狀況下,構造函數裏面的this就指向返回的這個對象
   但用new調用構造函數時,還須要注意一個問題,若是構造函數顯示的返回了一個object類型的對象,那麼這次運算結果最終會返回這個對象,而不是咱們以前所期待的this,這裏咱們經過下面的兩段代碼搞清楚構造函數是否顯示返回object類型對象之間的區別
   構造函數顯示的返回一個object類型的對象,那麼最終使用的就是手動返回的這個對象
  ES6類的聲明
   在ES6中,已經開始愈來愈貼近其餘好幾語言了,在ES6中有了類這個概念,使用class建立類。而後從類裏面實挒化對象
   可是,須要說明的是,雖然有了class這種關鍵字,可是這只是一種語法糖,背後對象的建立仍是使用的是原型的方式
  靜態方法
   所謂靜態方法,又被稱之爲類方法。顧名思義,就是經過類來調用的方法。靜態方法的好處在於不須要示例化對象,直接經過類就可以進行方法的調用
   在ES6建立類的方法的時候,能夠給方法前面添加一個關鍵字static,來建立一個靜態方法
 與原型相關的方法
  prototype和__proto__
   prototype是構造函數上面的一個屬性,指向一個對象,這個對象是構造函數實挒化出來的對象的原型對象。實挒化出來的對象能夠經過__proto__來找到本身的原型對象
  Object.getPrototypeOf()
   也能夠經過Object.getPrototypeOf()來查找一個對象的原型對象
  constructor屬性
   經過constructor屬性,咱們能夠查看到一個對象的構造函數是什麼,換句話說,就是這個對象是如何得來的
  instanceof操做符
   判斷一個對象是不是一個構造函數的實挒,若是是返回true,不然返回false
 HTML5 API
  Web Storage
   它提供了一種存儲方式,可讓web頁面實如今客戶端瀏覽器中意鍵值對形式在本地保存數據
   Cookie存儲機制優勢
    簡單易用
    瀏覽器負責傳送數據
    瀏覽器自動管理不一樣站點的Cookie
   Cookie缺點
    由於他是簡單的文本存儲數據,因此Cookie安全性不好,保存在客戶端瀏覽器,很容易被竊取
    存儲內容有限,上線只有4KB
    存儲Cookie數量有限,多數瀏覽器上限爲30-50個
    若是瀏覽器安全配置爲最高級別,nameCookie會失效
    Cookie不適合大量數據存儲,由於Cookie由每一個對服務器的請求來傳遞,從而形成Cookie速度緩慢效率低下
   localStorage
    它是一種沒有時間限制的存儲方式,能夠將數據保存在客戶端硬盤獲其餘存儲器中
    瀏覽器關閉不會讓數據小時,再次打開瀏覽器,咱們依舊能夠訪問到這些數據,除非咱們刪除,不然永不過時
   sessionStorage
    將數據保存在session對象中,web中session指用戶瀏覽某個網站時,從進入到關閉瀏覽器所通過的時間
    session對象在瀏覽器關閉後,這些數據會被刪除
   Web Storage優勢
    提供了易於使用的API接口,只須要設置鍵值對應便可使用,簡單方便
    在存儲容量方面能夠根據用戶分配的磁盤配額進行存儲,可以在每一個用戶域存儲5MB-10MB內容,用戶不只能夠存儲session,還能夠存儲許多信息,如設置偏好,本地化的數據和離線數據等
    它提供了JS編程的接口,開發者可使用JS客戶端腳本實現許多之前只能在服務器端才能完成的工做
   使用
    例
   storage事件
    key:告訴咱們被修改的條目的鍵
    newValue:告訴咱們被修改後的新值
    oldValue:告訴咱們修改前的值
    storageArea:告訴咱們是本地存儲仍是會話存儲
    url:改變鍵的文檔地址
  Geolocation
   他是html5新增的地理位置應用程序接口,它提供了一個能夠準確感知瀏覽器用戶當前位置的方法
    子主題 1
  Web Worker
   它是一項後臺處理技術,有了它,用戶能夠很容易的建立在後臺運行的線程,這個線程被稱爲Worker
   ie不支持,Firefox3.5以上支持,Opera10.6以上支持,Chrome3.0以上支持,Safari4.0以上支持
  多媒體
   爲了作到瀏覽器兼容,咱們能夠將多媒體文件的路徑卸載 source 標籤中
   若是取藥插入視頻,咱們將audio(音頻)標籤換成video(視頻)標籤
   相關屬性和方法
    在JS中,相關的屬性和方法:
    muted:是否靜音,true開啓
    autobuffer:true後實現自動緩衝
    autoplay:設置自動播放
    loop:設置後將會重複播放
    poster:設置封面,只有video能夠,封面只是一張圖,沒有播放的時候顯示的圖片
    width和height:設置視頻的寬高
    volune:設置音量
    currentTime:獲取多媒體當前所播放的具體時間
    playbackRate:設置快進或者快退速度的數字值,值爲1正常播放
    duration:多媒體播放時長
    paly:開始播放
    pause:暫停播放
    volumechange:調整多媒體音量
    loadedmetadata:在多媒體全部原數據被加載時會觸發該事件
  Canvas畫圖
   他是網頁上一個矩形單元,能夠用JS在上面繪畫
   添加canvas元素
   直線
   矩形
   圓形
   三角
   清除
  SVG
   同上,也是畫圖工具,在Canvas出來以前,很長一段時間都是用它
   SVG意爲可縮放矢量圖形,它是使用XML格式來定義圖像經過SVG畫出來的圖形是矢量圖,在放大或者改變尺寸,他的質量不會損失
   優點
    它能夠被很是多的工具讀取和修改(好比記事本)
    他和JPEG和GIF圖像比較起來,尺寸更小,且可壓縮性更強
    可伸縮
    可在任何分辨率下被高質量的打印
    能夠在圖像質量不降低的狀況下被放大
    他的文本可選,也能夠被搜索(很適合作地圖)
    能夠喝Java技術一塊兒運行
    是開放標準
    他的文件是純粹的XML
    它的主要競爭者是Flash
   繪圖
    矩形
    圓形
    橢圓
    線
    折線
    多邊形
    路徑
  HTML5 拖放
   拖放,就是抓取對象而後拖到另外一個位置
   源對象和目標對象
    源對象:指的是咱們鼠標點擊的一個事物,能夠是一張圖片,一個div,或一段文本等等
    目標對象:指的是咱們拖動源對象後移動到一塊區域,源對象能夠進入到這個區域,而後在這個區域上方懸停(未鬆手),能夠是鬆手釋放講源對象放置此處(已鬆手),也能夠懸停後離開該區域
   拖放相關API
    源對象
     dragstart:源對象開放拖放
     drag:源對象拖放過程當中(鼠標可能在移動也可能未移動)
     dragend:源對象拖放過程結束
    過程對象
     dragenter:源對象開始進入過程對象範圍內
     dragover:源對象在過程對象範圍內移動
     dragleave:源對象離開過程對象的範圍
    目標對象
     drop:源對象被拖放到目標對象內
   DataTransfer對象
    serData():dataTransfer對象中存入數據,接收兩個參數,第一個表示存入數據種類的字符串,第二個爲要存入的數據
    getData():他能夠從dataTransfer對象中讀取數據,參數在爲setData中指定的數據種類
    clearData():清除dataTransfer對象存放的數據,參數可選,爲數據種類,若是參數是空的,就清楚全部種類的數據
    setDragImage():經過img元素來設置拖放圖標,第一個爲圖表元素,第二個爲圖表元素離鼠標指針的X軸位移量,第三個爲圖標元素離鼠標指針Y軸位移量
    effectAllowed和dropEffect屬性:結合起來設置拖放的視覺效果
    注:IE不支持data Transfer對象
   拖放,例:
  Notification
   傳統桌面通知能夠寫一個div放到頁面右下角自動彈出來,並經過輪詢等方法獲取並推送給用戶
    弊端是:咱們在一個網站購物時,不知道另外一個網站有消息推送過來,咱們必須等用戶切換到另外一個網站才能知道有消息推送過來,這種方法是基於頁面存活的
    因此須要用Notification,不管用戶當前在看那一個頁面,只要有消息,都能推送給用戶
    例
   使用
    建立
    延時的系統通知
    事件處理
     Notification.onclick:處理click事件的處理,每當用戶點擊通知時被觸發
     Notification.onshow:處理show事件的處理,每當通知顯示時被觸發
     Notification.onerror:處理error事件的處理,每當通知遇到錯誤時被觸發
     Notification.onclose:處理close事件的處理,每當用戶關閉通知時被觸發
 混入技術
  淺複製與深複製
   雖然咱們實現了對象的混入,可是,這種混入有一個缺點,那就是混入時若是對象的屬性是一個引用類型的數據,例如是一個數組或者是一 個對象,那麼只會發生淺複製,也就是說只會複製其引用
   建立一個mixin()函數,該函數會對一一個對象的全部屬性進行深度的複製
 內置對象添加方法
 this指向
  普通函數中this指向
   this指向全局對象。當this是在全局中使用,或者是在函數中,可是該函數不做爲對象的方法,只是做爲普通函數被調用時,指向的就是全局對象(node裏面是global對象,瀏覽器環境裏面是window對象)
   以普通函數的方式調用的時候,不管嵌套多少層函數,this 都是指向全局對象
  改變this指向
   使用call或者apply來修改this指向
   使用bind()方法強行綁定this指向
    語法以下:fun. bind(thisArg[, arg1[, arg2[, ...]]])
    thisArg 當綁定函數被調用時,該參數會做爲原函數運行時的this指向
    arg1, arg2, .... 當綁定函數被調用時,這些參數將置於實參以前傳遞給被綁定的方法。
   箭頭函數的this指向
    始終是指向的外層做用域。
 繼承
  繼承的缺點
   首先若是繼承設計得很是複雜,那麼整個程序的設計也會變得龐大而臃腫,甚至常常會出現「大猩猩與香蕉」的問題。「大猩猩與香蕉」這個名字來自於Eriang編程語言的創始人Joe Armstrong的文章:你想要一個香蕉,可是獲得是拿着香蕉和整個叢林的大猩猩
   還有一個問題就是,若是是像c++那樣的多繼承語言,那麼還可能會遇到菱形繼承的問題。
    單繼承
     所謂單繼承,就是指只有一個父類
    多繼承
     所謂多繼承,就是指有多個父類
    菱形繼承問題
     首先須要說明,菱形繼承問題只會在多繼承裏面纔會出現。列如:A和B都繼承Base類,假設Base類裏面有一個成員方法,那麼A和B裏面都會有這個成員方法,這個時候A和B兩個類又都對這個成員方法進行了修改。接下來讓一個C來同時繼承A和B,那麼這個時候就會產生一個問題,對於同名的方法,哪究竟使用哪個,這就是所謂的菱形繼承問題,這個是屬於設計上的問題
     不過,JavaScript是一門單繼承的語言,因此必定程度上避免了菱形繼承的問題
  對象冒充
   最先的時候,在JavaScript裏面採用的是對象冒充的方式來實現的繼承。所謂對象冒充,就是用父類(構造函數)去充當子類的屬性
  方法借用模式
   如今屬性JavaScript繼承,基本上不會再使用對象冒充了,可是上面之因此要介紹對象冒充這種繼承方式,是爲了順帶引出JS中一個很是有特點的方法借用模式,這在JS中是至關靈活的一種模式,不須要繼承,就能夠從父類或者原型上面借用相應的屬性和方法。
  ES6繼承模式
   從ES6開始,可使用extends關鍵字來實現繼承了
 封裝
  通常來說,對於私有屬性,又一個不成文的規定,那就是習慣使用_開頭來命名私有屬性。
  封裝後的屬性,咱們能夠將其稱之爲私有屬性,對於外部來說,私有屬性是不可見的,這個咱們已經知道了,可是對於內部來說,私有屬性是可見的。這就比如電視機裏面的零件封裝後外部沒法直接訪問到,可是電視機內部是可使用這個零件來完成相應的功能的
  存儲器
   get : 一旦目標屬性被訪問時,就會調用相應的方法
   set  :  一旦目標屬性被設置時,就會不調用相應的方法
 Ajax
  基本介紹
   在2005年提出,一種新的Web應用程序方法,全稱 Asynchronous JavaScript and XML。
    Asynchronous:翻譯成中文是異步的意思,當發送數據請求時,程序沒必要停下來等待相應,他能夠繼續運行,等待響應收到時觸發事件。經過使用回調來管理這種過程,程序可以以有效的方式運行,避免了數據來回傳輸帶來的延遲
    JavaScript:利用JavaScript咱們能夠接受來自服務器端返回的數據,並將這些數據實時的更新到頁面上
    XML:最開始術語 Ajax 被創造,常常用XML文檔返回,但實際上能夠發送許多不一樣類型的數據。目前爲止 Ajax 最經常使用的是JSON,他比XML更輕量且更容易解析,它還具有JS原生支持的優勢,因此咱們能夠處理JS對象,沒必要使用DOM來解析XML
   優勢
    頁面無刷新,在頁面內在於服務器通訊,減小用戶等待時間,加強用戶體驗
    用異步方法與服務器通訊,響應速度快
    能夠把一些本來服務器的馮做轉接到客戶端,利用客戶端閒置能力處理,減輕了服務器和寬帶的負擔,節約空間和寬帶租用成本
    基於標準化的並被普遍支持的技術,並不須要下載插件或者小程序。
   缺點
    沒法操做後退,就是不支持瀏覽器頁面後退
    對搜索引擎的支持比較弱
    可能會影響程序中的異步處理機制
    安全問題,對一些網站攻擊,如csrf,xxs,sql注入等不能很好的防護
  原生Ajax的實現
   建立XMLHttpRequest對象
   發出HTTP請求
   接收服務器傳回的數據
   更新網頁數據
  Mock.js
   先後端分離:讓前端工程師獨立於後端開發
   開發無侵入:不須要修改既有的代碼,就能夠攔截Ajax請求,返回模擬的響應數據
   數據類型豐富:支持生成隨機的文本、數字。布爾值、日期、郵箱、連接、圖片和顏色等
   增長單元測試的真實性:經過隨機數據,模擬各類場景
   用法簡單:符合直覺的接口
   方便擴展:支持擴展更多數據類型,支持自定義函數和正則
   語法規範
    數據模板定義規範DTD
     數據模板中的每一個屬性由3部分構成:屬性名、生成規則、屬性值html

相關文章
相關標籤/搜索