哇,看了本身最近的一篇文章,已經恰好一年來,其實那時候剛剛接觸Jest,啥也不會(雖然如今其實也同樣不會,嘿嘿),就想記錄下工做中遇到的一些問題。可是後來在持續的工做中才發現,那兩篇文章寫的實際上是頗有一些問題的。但願不會給你們帶來誤導,在某些特殊的狀況下,確實能夠解決描述中的問題,可是實際上,並無真正的理解問題是什麼,只是片面的解決罷了。css
時隔一年,最近想要提高下本身的js功底,提高下本身在更高層次的方向上的一些思路和能力,因此看了這本書。其中有些內容一方面因爲個人能力較差,媽的居然沒看懂,一方面由於是翻譯的,因此總以爲怪怪的。好吧,跟我以前的理由如出一轍。前端
固然,這很長的一段時間,雖然沒寫博客,可是也抄了很多東西,好比《css世界》,好比深刻學習了一下vue,等等等等。再好比以前的一段時間,真的忙的不行,懶得要死。vue
我工做到今天差很少恰好三年半的時間,感受本身的水平,也不過一直在模仿,從未被超越。也不知什麼時候(感受整個工做生涯都沒戲了)能有一點真正的本身的見解和看法。也算我沒有白白的幹了前端好幾年。程序員
在正文開始以前,我想說的是,我寫的內容,全都是抄的。說實話我真的沒想到會有幾千的閱讀量,在將來和之後,也但願我本身能夠寫出來更細膩和認真的內容,而不是爲了寫而寫(其實我主要是以爲本身記不住,想要看的時候這樣比較方便)。編程
囉嗦了這麼多,那麼開始真正的內容吧。設計模式
其中所涉及到的內容包括基本技巧,好比變量提高,循環,類型轉換,命名約定等。後面包括字面量,函數,對象,代碼複用(繼承),設計模式,DOM和瀏覽器模式等核心內容。而且在每個內容下會詳細介紹及細分規劃。數組
說實話,我看了一遍,可是以爲其中內容深厚且重要,是每個進階前端開發都必須學會,學懂的知識。故,有此係列博文。瀏覽器
如下是真正的正文:哈哈。函數式編程
What is 模式?函數
廣義上的模式是指「重現事件或者對象的主題,……它是一個能夠用來產生其餘事物的模版或者模型」。在軟件開發過程當中,模式是指一個通用問題的解決方案。一個模式不只僅是一個能夠用來複制粘貼的代碼解決方案,更多地是提供了一個更好的實踐經驗、有用的抽象化表示和解決一類問題的模板。
學習和識別模式,是很是重要的,理由以下:
1. 經過學習模式,能夠幫助咱們使用通過實踐證實有效的經驗來編寫代碼,而不是去作不少無用功。
2. 模式提供了某種程度上的抽象。大腦在必定的時間內,僅能記住必定數量的內容,所以思考更復雜的問題時,使用模式可讓您集中精力去用已有的模式來解決該問題,而不須要被一些低層次的細節所困擾。
3. 模式,能夠改善開發者和開發團隊之間的交流,一般開發者是採起遠程交流而不是面對面進行交流。爲一些編碼技術或方法貼上標籤並命名,能夠很方便地確保雙方可以瞭解對方確切表達的意思。
本系列內容,核心討論如下三種類型的模式,即:設計模式,編碼模式以及反模式。尤爲要說明的是反模式。反模式並非一個bug,或者是編碼錯誤,它僅僅是常見的、引起的問題比解決的問題更多的一種方法。
Javascript基礎概念
面向對象
咱們常常會聊到面向對象,因此,在這裏,咱們就把什麼是面向對象,到底怎麼面向對象開發,來搞一個清楚。
JavaScript語言有一個特性,即萬物皆對象,你看到的任何一段JavaScript代碼,都頗有多是一個對象。只有五種基本類型不是對象:數值類型、字符串類型、布爾類型、空類型和未定義類型。其中前三個類型有對應的以基本類型封裝形式體現的的對象表示(後面會詳細介紹)。數值類型、字符串類型的值能夠經過程序員或者位於幕後的JavaScript解析器來實現向對象的轉換。
函數實際上也是對象,函數有屬性和方法。
任何一門語言中最簡單的事情就是定義一個變量。在JavaScript中,一旦定義好了變量,同時也就已經正在處理對象了。首先,該對象會自動成爲內置對象的一個屬性,成爲激活對象(若是該變量是一個全局變量,那麼該變量會成爲全局對象的一個屬性)。第二,該變量實際上也是僞類(這裏我理解爲,未經過「顯式」的方法,好比構造函數,生成(或繼承)的具備屬性的一個對象),該屬性決定了該變量是否能夠被修改、被刪除和在一個for-in循環中枚舉(能夠經過Object.getOwnPropertyDescriptor來查看
)。
那麼對象究竟是什麼呢?其實對象僅僅是一個容器,該容器包含了命名的屬性,鍵值對(大多數)的列表。這裏面的屬性能夠是函數(函數對象),這種情形下咱們稱其未爲方法。
關於建立的對象的另一件事情是能夠在任意時間修改該對象(儘管ECMAScript引入了API來防止突變)。能夠對一個對象執行添加、刪除和更新它的成員變量。
最後,須要記住的是對象主要有兩種類型:原生的(Native,如ECMAScript標準),主機的(Host即宿主的,好比瀏覽器環境)。另外,原生對象能夠進一步分爲內置對象(例如數組,日期對象等)和用戶自定義對象(如var o = {})等。主機對象包含Windows對象和全部的DOM對象。
沒有類
在JavaScript中沒有類,咱們只處理對象。儘可能多使用對象的組合,而不是使用類的繼承。這句話的意思是經過已有的對象組合來獲取新對象,是比經過很長的父 - 子繼承鏈來建立新的對象更好的一方法。
原型
JavaScript沒有繼承,儘管這是重用代碼的一種方式。可使用多種方法來實現繼承,這裏一般使用原型。原型是一個對象,而且建立的每個都會自動獲取一個Prototypes屬性,該屬性指向一個新的空對象。該對象幾乎等同於採用對象字面量或Object()建立的對象,區別在於他的constructor屬性指向了所建立的函數,而不是指向內置的Object()函數。能夠爲該空對象增長成員變量,之後其餘對象也能夠從該對象繼承並像使用本身的屬性同樣使用該對象的屬性。
要記住,每個函數都有prototype屬性,每個對象都有一個__proto__屬性。(先帶着疑問,後面的文章會詳細解答。)
簡單的介紹以後,我又想起了最開始聊過的問題。到底什麼是面向對象?到底如何面向對象開發(編程)?
首先要說的是,面向對象與面向對象編程即OOP(Object Oriented Programming)是兩回事,我的理解,面向對象是一種描述,咱們應該使用怎樣的手段去作一件事,而面向對象編程,則是一種方法,也就是說,咱們使用面向對象的手段或方法,去進行開發。另外的,還有函數式編程,那我我的理解,函數式編程也是一種方法,咱們使用函數式的方法、方式去編程,編寫代碼。
那麼面向對象是什麼呢?其實個人理解,就是在一切的編程「溝通」中數據流轉的執行方式,咱們經過對象的方式,去進行數據的傳遞及流轉,那什麼是「對象的方式」,即:類與實例,而js中沒有類的概念,那麼就要使用到原型。因此,在js中發揮原型的能力,使用原型的能力去編程,就能夠大概的理解爲是面向對象的編程(固然,要知道,這其實是很片面的理解)。
但願個人理解沒有出現方向性的錯誤,後面,會詳細的介紹原型以及繼承的內容。