JavaScript是一門基於Web的語言。它最初是做爲在網頁中操做一些特定類型元素(例如圖像和表格字段)的方法,如今該語言的發展已經遠遠超出了預期。除了做爲客戶端瀏覽器所使用的腳本,如今JavaScript還能夠用於正在增長的更加多樣化的平臺編程。例如能夠用於編寫服務端代碼(.net或node.js)、應用程序的擴展(Firefox和Photoshop編寫擴展)、移動應用程序和命令行腳本。node
JavaScript也是一門不同凡響的語言。它沒有類,而且函數是用於不少任務的頂層類對象。最初不少程序員認爲該語言效率低下,但近年來該觀念有所改變。有趣的是,例如Java和PHP這類語言開始增長閉包和匿名函數特性,而JavaScript程序員早就已經享用了這些特性。程序員
JavaScript是一門動態性較強的語言,經過配置可使其看上去和感受起來像您過去習慣的其餘語言同樣。但接受JavaScript與其餘語言的不一樣,並學習其特定的模式多是更好的方法。編程
什麼是模式(Pattern)windows
維基百科解釋爲: 在物體或事件上,產生的一種規律變化與自我重複的樣式與過程。在模式之中,某些固定的元素不斷以可預測的方式週期性重現。最基本而常見的模式,稱爲密鋪,具有重複性以及週期性兩大特徵。找尋出固定模式是人類基本的認知功能之一。數組
在軟件開發中,模式是指一個通用問題的解決方案。一個模式不只僅是一個能夠用來複制粘貼的代碼解決方案,更多地提供了一個更好的實踐經驗、有用的抽象化表示和解決一類問題的模板。瀏覽器
學習模式的理由閉包
1. 經過學習模式,能夠幫助咱們使用通過實踐證實有效的經驗來編寫代碼,而無需作不少無用工做。編程語言
2. 模式提供了某種程度上的抽象。咱們的大腦在必定時間內僅僅能記住必定數量的內容,所以在思考更復雜的問題時,使用模式可讓您集中經理去用已有模式來解決該問題,而不須要被一些低層次的細節所困擾。函數
3. 模式能夠改善開發者和開發團隊之間的交流。學習
JavaScript基本概念 · 面向對象
JavaScript是一門面向對象的語言,任何一段Javascript代碼都頗有多是一個對象。只有五中基本類型不是對象:數值類型(Number)、字符串類型(String)、布爾類型(Boolean)、空類型(null)和未定義類型(undefined)。其中前三個類型有對應的以基本類型封裝形式體現的對象表示。數值類型、字符串類型和布爾類型的值能夠經過程序員或者位於幕後的JavaScript解釋器來實現向對象的轉換。
函數(Function)實際上也是對象,函數有屬性和方法。
在任何一門程序語言中最簡單的事情就是定義一個變量。在JavaScript中,一旦定義好一個變量,同時也就已經正在處理對象了。首先,該變量會自動成爲內置對象的一個屬性,成爲激活對象(若是該變量是一個全局變量,那該變量會成爲全局對象的一個屬性)。
var a = 1; console.log(window.a); // return => 1 console.log(window["a"]); // return => 1
該變量實際上也是僞類,由於它擁有其自身的屬性(attributes),該屬性決定了該變量是否能夠被修改、被刪除和在一個for in循環中進行枚舉。這些屬性在EMCAScript 3中沒有直接對外提供,但在第5版本中,提供了一個特殊描述符方法來操做這些屬性。
那麼對象是什麼東西呢?由於他們須要作不少事情,因此這些對象必須十分特殊。實際上對象十分簡單的。一個對象僅僅是一個容器,該容器包含了命名的屬性、鍵-值對(大多數)的列表。這裏面的屬性能夠是函數(函數對象),這種情形下咱們稱其爲方法(Function)。
關於建立的對象的另一件事情是能夠在任意時間修改此對象(ECMAScript 5引入了API來防止突變)。能夠對一個對象執行添加、刪除和更新它的成員變量。若是關注隱私和訪問,在模式方面也有對應的內容。
對象主要有兩種類型:
原生的(Native)、主機的(Host)
原生對象能夠進一步分爲內置對象(例如數組、日期對象等)和用戶自定義對象(例如 var P={x: 0, y: 5};)等。
主機對象包含windows對象和全部的DOM對象。若是還不肯定使用的是不是主機對象,能夠嘗試在不一樣的、無瀏覽器的環境下運行該代碼,若是該代碼能正確的運行,那麼應該使用的是原聲的對象。
JavaScript基本概念 · 沒有類
在JavaScript中沒有類。不使用類的作法可使得編程更爲簡潔。在建立一個對象的時候,無需先擁有一個類。這對於其餘編程語言是不一樣的。
對於其餘編程語言,建立對象的方式(C#):
public class P{ private int x; private int y; public P(int x, int y){ this.x = x; this.y = y; } } P pointA = new P(1, 2);
而JavaScript:
var pointA = { x: 1, y: 2};
這樣在須要建立一個簡單對象的時候,每每JavaScript更爲簡單,咱們亦但願讓對象更爲簡潔。
在JavaScript中,能夠在須要的時候建立一個空對象,而後開始爲該對象添加感興趣的成員變量。能夠爲該對象添加基本類型、函數和其餘對象來做爲該對象的屬性。一個「空對象」實際上並非徹底空白的,他實際上包含了一些內置的屬性,但沒有其自身的屬性。
「儘可能多使用對象的組合,而不是使用類的繼承」。這句話的意思是經過已有的對象組合來獲取新對象,是比經過很長時間的父-子繼承鏈來建立新的對象更好的一種方法。在JavaScript中能夠很簡單地實踐該建議,之因此這麼簡單是由於在JavaScript中沒有類,所以使用對象組合是惟一能夠採起的方法。
JavaScript基本概念 · 原型(Prototypes)
JavaScript沒有繼承,儘管這是重用代碼的一種方式。但JavaScript可使用多種方法實現繼承,這裏一般使用原型。原型是一個對象,而且建立的每個對象都會自動獲取一個Prototypes屬性,該屬性指向一個新的空對象。該對象幾乎等同於採用對象字面量或Object()建立的對象,區別在於它的構造器(constructor,該屬性返回對建立此對象的數組函數的引用)屬性指向了所建立的函數,而不是指向內置的Object()函數。能夠爲該空對象增長成員變量,之後其餘對象也能夠從該對象繼承並像使用本身的屬性同樣使用該對象的屬性。
var P = function (x, y) { this.x = x; this.y = y; } console.log(P.prototype); // Object {} console.log(P.constructor); // function Function() { [native code] } var p = new P(1, 2); console.log(p.constructor); // function (x, y) { this.x = x; this.y = y; } console.log(p.constructor.prototype === P.prototype); // true
原型就是一個對象(不是一個類,也不是其餘特殊的元素),每個函數都有Prototype屬性。
JavaScript基本概念 · 環境
JavaScript須要運行環境來執行。一般JavaScript是在瀏覽器中執行的,可是這不是惟一的運行環境。本書中介紹的模式大部分是和核心JavaScript(ECMAScript)相關的。所以它們是與環境無關的。除了如下兩種狀況之外:
1. 特定針對瀏覽器的模式。
2. 其餘示範模式的實際應用程序範例。
環境會提供自身的主機對象(例如window對象),該對象在ECMAScript標準中沒有定義,可能會帶來沒有特別提到的和不肯定的行爲。
JavaScript基本概念 · EMCAScript 5
核心的JavaScript編程語言(不包含DOM、BOM和額外的主機對象)是基於EMCAScript標準(縮寫爲ES)。該標準的第三版是在1999年被官方所接受,而且是當前瀏覽器所使用的標準。該標準的第四版被放棄了,第五版在2009年12月獲得經過,這相比第3版過去了10年。
目前支持ECMAScript 5瀏覽器
瀏覽器 | IE | Firefox | Chrome | Safari | Opera | IOS Safari |
Opera Mini |
Android Browser |
Blackberry Browser |
IE Mobile |
版本 | 10 - 11 | 22 - 25 | 28 - 31 | 6 - 7 | 16 - 17 | 5 - 7 | 不支持 | 3.0 - 4.2 | 7 - 10 | 10 |
此表統計於2013年9月
第5版ECMAScript增長了一些新的內置對象、方法和屬性,但最重要的是增長了所謂的strict(嚴格)模式,該模式實際上能夠從JavaScript語言中移除某些特性,使得程序更爲簡潔和不容易出錯。例如with語句的語法在這幾年中有不少爭議。如今在ES5的strict模式中將會引起錯誤,儘管在非strict模式中能正常運行。strict模式是經過一個普通字符串來觸發的,在該語言的較早的實現方式中將會忽略掉該代碼。這意味着經過使用strict模式,能夠實現向後兼容性,由於在以前不能理解該代碼的瀏覽器中,它不會引發錯誤。
在一個做用域(能夠是函數做用域、全局做用域或者在將字符串的起始位置傳遞給eval()中),也可使用以下字符串:
function My(){ "use strict"; //...如下放置函數的其他部分 }
這就意味着函數中的代碼是在ECMAScript語言的strict子集中運行。對於以前的瀏覽器,這僅僅是一個字符串,並無分配給任何變量,所以不會被使用,進而不會致使錯誤。
在本語言的將來計劃中,將只容許使用strict模式。考慮到ES5是一個過渡版本,本語言如今鼓勵開發者使用strict模式編寫代碼,但不強制要求。