摘要:創(chuàng)建類(lèi)中并沒(méi)有真正的類(lèi),但中有構(gòu)造函數(shù)和運(yùn)算符。任何函數(shù)都可以用作構(gòu)造函數(shù),構(gòu)造函數(shù)必須使用運(yùn)算符作為前綴來(lái)創(chuàng)建新的實(shí)例。調(diào)用構(gòu)造函數(shù)時(shí)不要丟掉關(guān)鍵字。這里使用基于原型的繼承,而沒(méi)有用到構(gòu)造函數(shù)和關(guān)鍵字。
1.創(chuàng)建類(lèi)
JavaScript中并沒(méi)有真正的類(lèi),但JavaScript中有構(gòu)造函數(shù)和new運(yùn)算符。構(gòu)造函數(shù)用來(lái)給實(shí)例對(duì)象初始化屬性和值。任何JavaScript函數(shù)都可以用作構(gòu)造函數(shù),構(gòu)造函數(shù)必須使用new運(yùn)算符作為前綴來(lái)創(chuàng)建新的實(shí)例。
new運(yùn)算符改變了函數(shù)的執(zhí)行上下文,同時(shí)改變了return語(yǔ)句的行為。實(shí)際上,使用new和構(gòu)造函數(shù)很類(lèi)似于傳統(tǒng)的實(shí)現(xiàn)了類(lèi)的語(yǔ)言:
var Person = function (name) { this.name = name; }; //實(shí)例化一個(gè)Person var alice = new Person("alice"); //檢查這個(gè)實(shí)例 assert(alice instanceof Person);
如果不使用new運(yùn)算符而是:Person("bob";)這個(gè)函數(shù)只會(huì)返回undefined,并且執(zhí)行上下文是window(全局)對(duì)象,無(wú)意間創(chuàng)建了一個(gè)全局變量name。調(diào)用構(gòu)造函數(shù)時(shí)不要丟掉new關(guān)鍵字。
2.給類(lèi)添加函數(shù)在JavaScript中,在構(gòu)造函數(shù)中給類(lèi)添加函數(shù)和給對(duì)象添加屬性是一樣的:
Person.find - function (id) {}; var person = Person.find(1);
要想給構(gòu)造函數(shù)添加實(shí)例函數(shù),則需要用到構(gòu)造函數(shù)的prototype:
Person.prototype.breath = function(){}; var person = new Person; person.breath();3.取消事件
當(dāng)事件冒泡時(shí),可以通過(guò)stopPropagation()函數(shù)來(lái)終止冒泡,這個(gè)函數(shù)是event對(duì)象中的方法。比如這段代碼,任何父節(jié)點(diǎn)事件回調(diào)都不會(huì)觸發(fā):
button.addEventListener("click", function (e) { e.stopPropagation(); }, false);4.事件對(duì)象
和上面提到的函數(shù)stopPropagation()和preventDefault()一樣,event對(duì)象還包含很多有用的屬性。
事件類(lèi)型 | 含義 |
---|---|
bubbles | 表示事件是否通過(guò)DOM以冒泡形式觸發(fā) |
button | 表示鼠標(biāo)所按下的按鈕 |
ctrlKey | 表示Ctrl鍵是否按下 |
altKey | 表示alt鍵是否按下 |
shiftKey | 表示Shift鍵是否按下 |
metaKey | 表示Meta鍵是否按下 |
isChar | 表示當(dāng)前按下的鍵是否表示一個(gè)字符 |
charCode | 表示當(dāng)前按鍵的unicode值 |
keyCode | 表示非字符按鍵的unicode值 |
which | 表示當(dāng)前案件的unicode值,不管當(dāng)前按鍵是否表示一個(gè)字符 |
pageX,pageY | 事件發(fā)生時(shí)相對(duì)于頁(yè)面的坐標(biāo) |
screenX,screenY | 事件發(fā)生時(shí)相對(duì)于屏幕的坐標(biāo) |
currentTarget | 事件冒泡階段所在的當(dāng)前DOM元素 |
target,originalTarget | 原始的DOM元素 |
relatedTarget | 其他和事件相關(guān)的DOM元素 |
從事件冒泡開(kāi)始就發(fā)生了事件委托,我們可以直接給父元素綁定事件監(jiān)聽(tīng),用來(lái)檢測(cè)在其子元素內(nèi)發(fā)生的事件。
//在ul列表上做了事件委托 list.addEventListener("click", function (e) { if (e.currentTarget.tagName == "li") { return false; } }, false);6.原型繼承
這里使用Object.create()來(lái)構(gòu)造我們的ORM。這里使用基于原型的繼承,而沒(méi)有用到構(gòu)造函數(shù)和new關(guān)鍵字。
Object.create()只有一個(gè)參數(shù)即原型對(duì)象,它返回一個(gè)新對(duì)象,這個(gè)新對(duì)象的原型就是傳入的參數(shù)。換句話說(shuō),傳入一個(gè)對(duì)象,返回一個(gè)繼承了這個(gè)對(duì)象的新對(duì)象。
有些瀏覽器沒(méi)有Object.create()方法,比如IE,可以模擬出該函數(shù):
if (typeof Object.create !== "function") { Object.create = function (o) { function F() { } F.prototype = o; return new F(); } }7.JSONP
JSONP(JSON with padding),這是另一種從遠(yuǎn)程服務(wù)器抓取數(shù)據(jù)的方式。原理是通過(guò)創(chuàng)建一個(gè)script標(biāo)簽,所轄的外部文件包含一段JSON數(shù)據(jù),數(shù)據(jù)是由服務(wù)器所返回的,作為參數(shù)包裝在一個(gè)函數(shù)調(diào)用中。script標(biāo)簽獲取腳本文件并不受跨域限制,所有瀏覽器都支持這種技術(shù)。
8.localstorage用法//設(shè)置一個(gè)值 localStorage["someData"] = "wem"; //存儲(chǔ)數(shù)據(jù)的個(gè)數(shù) var itemsStored = localStorage.length; //設(shè)置一個(gè)項(xiàng)(是一種hash寫(xiě)法) localStorage.setItem("someData", "wem"); //得到一個(gè)已經(jīng)存儲(chǔ)的值,如果不存在就返回Null localStorage.getItem("someData");//"wem"; //刪除一個(gè)項(xiàng),如果不存在就返回null localStorage.removeItem("someData"); //清空本地存儲(chǔ) localStorage.clear();
數(shù)據(jù)均存儲(chǔ)為字符串,所以如果你想保存的數(shù)據(jù)是對(duì)象或數(shù)字,則必須自己做類(lèi)型轉(zhuǎn)換,如果使用JSON的話,則需要將對(duì)象先做序列化處理再保存它們,從本地存儲(chǔ)中讀取JSON時(shí)也需要將它轉(zhuǎn)換為對(duì)象:
var object = {some: "boject"}; //序列化并保存一個(gè)對(duì)象 localStorage.setItem("seriData", JSON.stringify(object)); //讀取并將JSON轉(zhuǎn)換為對(duì)象 var result = JSON.parse(localStorage.getItem("seriData"));9.動(dòng)態(tài)渲染視圖
var views = document.getElementById("views"); views.innerHTML = "";//將元素內(nèi)容清空 var container = document.createElement("div"); container.id = "user"; var name = document.createElement("span"); name.innerHTML = data.name; container.appendChild(name); views.appendChild(container);10.無(wú)交互行為內(nèi)容的閃爍(FUBC)
有時(shí)候用戶(hù)可能會(huì)看到頁(yè)面閃了一下,出現(xiàn)一部分沒(méi)有交互行為的內(nèi)容快速閃過(guò)(FUBC),比如在JavaScript執(zhí)行之前會(huì)有一部分無(wú)樣式的頁(yè)面原始內(nèi)容閃爍一下。如果你不依賴(lài)JavaScript來(lái)修改初始頁(yè)面的樣式,問(wèn)題其實(shí)并不嚴(yán)重。但是如果依賴(lài)JavaScript來(lái)操作樣式,則需要將樣式提取出來(lái)放入初始化CSS之中,比如隱藏一些元素或展示一個(gè)加載指示器,指示頁(yè)面正在加載中。
11.獲取文件信息HTML5的文件操作有一定的安全限制,主要的限制是只有被用戶(hù)選中的文件才能被訪問(wèn)。將文件拖曳至瀏覽器中、選擇要輸入的文件或?qū)⑽募迟N至Web應(yīng)用中,這些操作當(dāng)然可以滿足這一安全限制。盡管已經(jīng)有人實(shí)現(xiàn)了“基于JavaScript的文件系統(tǒng)”,但這里的訪問(wèn)都是基于沙箱的。顯然,允許JavaScript無(wú)限制的操作文件會(huì)帶來(lái)很?chē)?yán)重的安全風(fēng)險(xiǎn)。
在HTML5中使用File對(duì)象來(lái)表示文件,它有三個(gè)屬性:
name:文件名,這是一個(gè)只讀字符串;
size:文件大小,這是一個(gè)只讀的整數(shù);
type:文件的MIME類(lèi)型,是一個(gè)只讀字符串,如果類(lèi)型沒(méi)有指定就是空字符串;
出于安全的原因,文件的路徑是無(wú)法得到的。
12.拖曳拖曳的實(shí)現(xiàn)非常簡(jiǎn)單??梢詫⒃氐膁raggable屬性設(shè)置為true來(lái)啟用元素的拖曳。
WebSocket是HTML5規(guī)范的一部分,提供了基于TCP的雙向的、全雙工的socket連接。這意味著服務(wù)器可以直接將數(shù)據(jù)推送給客戶(hù)端,而不需要開(kāi)發(fā)者求助于長(zhǎng)輪詢(xún)或插件來(lái)實(shí)現(xiàn)。和之前的服務(wù)器推的技術(shù)相比,WebSocket有著巨大的優(yōu)勢(shì),因?yàn)閃ebSocket是全雙工的,而不是基于HTTP的,一旦建立鏈接就不會(huì)斷掉。
14.性能提高性能:減少HTTP請(qǐng)求的數(shù)量。每一個(gè)HTTP請(qǐng)求除了有TCP開(kāi)銷(xiāo)以外,還包含了大量的頭信息。保持最小的獨(dú)立連接數(shù)可以保證用戶(hù)的頁(yè)面家在速度更快。
將多個(gè)腳本文件合并成為一個(gè)腳本文件,或?qū)⒍鄠€(gè)CSS合并成為一個(gè)樣式表,能減少頁(yè)面渲染所需的HTTP連接的數(shù)量??梢栽诓渴鸹蜻\(yùn)行時(shí)這樣做。
使用CSS Sprites技術(shù)合并多張小圖成為一張大圖,然后使用CSS的background-image和background-position屬性在頁(yè)面中顯示對(duì)應(yīng)的圖片。只需要設(shè)定圖片要顯示的尺寸和背景位置的偏移坐標(biāo)。
避免重定向也是減少HTTP請(qǐng)求的數(shù)量的方法。
理解瀏覽器如何下載資源也很重要。為了加快頁(yè)面渲染,現(xiàn)代瀏覽器并行下載所需的資源。但是,在所有的樣式表和腳本下載完成之前,頁(yè)面是不會(huì)開(kāi)始渲染的。
script標(biāo)簽的defer屬性:設(shè)置defer的腳本將和其他資源一起并行下載,它們是不會(huì)阻塞頁(yè)面的渲染。HTML5還引入了一個(gè)新的腳本下載和執(zhí)行的模式,稱(chēng)作async。通過(guò)設(shè)置async屬性,腳本將在完成下載后等待合適的時(shí)機(jī)執(zhí)行代碼。這意味著有可能異步不會(huì)按照它們?cè)陧?yè)面中出現(xiàn)的順序執(zhí)行代碼,這又可能導(dǎo)致腳本執(zhí)行如有依賴(lài)順序時(shí)出錯(cuò)。如果腳本沒(méi)有依賴(lài)關(guān)系,async則是很有用的。
15.緩存緩存就是將最近請(qǐng)求的資源存儲(chǔ)到本地,以便接下來(lái)的請(qǐng)求能從磁盤(pán)中使用這些資源,而不用再次去下載。
針對(duì)靜態(tài)資源,可以通過(guò)添加一個(gè)表示“在很遠(yuǎn)的將來(lái)才過(guò)期”的Expires頭,讓緩存“永不”失效。這將保證瀏覽器只會(huì)下載一次該資源。所有的靜態(tài)資源文件都應(yīng)該這樣設(shè)置,包括腳本、樣式表和圖片。Expires: Thu, 20 March 2015 00:00:00 GMT建議相對(duì)于當(dāng)前日期設(shè)置一個(gè)表示“很遠(yuǎn)的將來(lái)”的失效日期。
但是如果想在那個(gè)時(shí)間之前讓資源過(guò)期怎么辦?在引用資源文件的URL查詢(xún)參數(shù)中添加文件的修改時(shí)間。這樣一來(lái),任何時(shí)候文件被修改,資源文件的URL都會(huì)改變,也即清除了緩存。
HTTP1.1引入了一類(lèi)新的頭,Cache-Control。它帶給開(kāi)發(fā)者更高級(jí)的緩存,同時(shí)還彌補(bǔ)了Expires的不足。Cache-Control的控制頭信息有很多選項(xiàng),可用逗號(hào)隔開(kāi):Cache-Control:max-age=3600, must-revalidate
Cache-Control參數(shù):
參數(shù) | 含義 |
---|---|
max-age | 指定資源的最大有效時(shí)間。和Expires不一樣的是,該指令是相對(duì)于該請(qǐng)求的時(shí)間。 |
public | 標(biāo)記資源是可被緩存的,默認(rèn)情況下,通過(guò)SSL或使用HTTP認(rèn)證后訪問(wèn)的資源,緩存是關(guān)閉的 |
no-store | 完全關(guān)閉緩存,動(dòng)態(tài)內(nèi)容才會(huì)更多的使用這個(gè)選項(xiàng) |
must-revalidate | 告訴緩存它們必須遵循任何你給定的信息,并基于這些信息來(lái)判斷資源的新舊程度 |
JavaScript源碼壓縮是從腳本文件中刪除不必要的字符,它不改變功能。樣式表和HTML文件也可以被壓縮。
17.Gzip壓縮在Web上Gzip是最流行并且支持最廣泛的壓縮方式。
18.使用CDN內(nèi)容分發(fā)網(wǎng)絡(luò)(或叫CDN)為你的站點(diǎn)提供靜態(tài)資源內(nèi)容服務(wù),以減少它們的加載時(shí)間。用戶(hù)和Web服務(wù)器之間的距離對(duì)加載時(shí)間有直接的影響。CDN將你的內(nèi)容部署在跨越多個(gè)地理位置的服務(wù)器上,故當(dāng)用戶(hù)發(fā)起一個(gè)請(qǐng)求時(shí),可從就近的服務(wù)器得到響應(yīng)資源。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/79987.html
摘要:當(dāng)然,這只是結(jié)合自己項(xiàng)目的工程結(jié)構(gòu)和特點(diǎn)設(shè)置的一套使用方式,僅供參考開(kāi)發(fā)富文本編輯器的教訓(xùn)由于項(xiàng)目的時(shí)間較緊張,我在頁(yè)面上應(yīng)用了框架的背景下,想當(dāng)然的想要把也應(yīng)用于富文本編輯器的開(kāi)發(fā),事實(shí)證明這是不太可行的。 此文已由作者劉詩(shī)川授權(quán)網(wǎng)易云社區(qū)發(fā)布。 歡迎訪問(wèn)網(wǎng)易云社區(qū),了解更多網(wǎng)易技術(shù)產(chǎn)品運(yùn)營(yíng)經(jīng)驗(yàn)。 最近我們的產(chǎn)品有一個(gè)需求是要在PC端做一個(gè)面向用戶(hù)的書(shū)評(píng)編輯器,讓用戶(hù)和編輯在蝸牛讀書(shū)...
摘要:初級(jí)書(shū)單深入理解人評(píng)價(jià)作者徐濤出版社機(jī)械工業(yè)出版社出版年年月日贊回復(fù)添加到豆列來(lái)自豆瓣讀書(shū)響應(yīng)式設(shè)計(jì)人評(píng)價(jià)作者出版社人民郵電出版社出版年年月日贊回復(fù)添加到豆列來(lái)自豆瓣讀書(shū)深入淺出中文版人評(píng)價(jià)作者馬勞克林出版社東南大學(xué)出版社出版年年月 初級(jí)書(shū)單 深入理解Bootstrap 7.0 (65人評(píng)價(jià))作者: 徐濤 出版社: 機(jī)械工業(yè)出版社 出版年: 2014-52015年1月19日 贊 回復(fù)添...
摘要:初級(jí)書(shū)單深入理解人評(píng)價(jià)作者徐濤出版社機(jī)械工業(yè)出版社出版年年月日贊回復(fù)添加到豆列來(lái)自豆瓣讀書(shū)響應(yīng)式設(shè)計(jì)人評(píng)價(jià)作者出版社人民郵電出版社出版年年月日贊回復(fù)添加到豆列來(lái)自豆瓣讀書(shū)深入淺出中文版人評(píng)價(jià)作者馬勞克林出版社東南大學(xué)出版社出版年年月 初級(jí)書(shū)單 深入理解Bootstrap 7.0 (65人評(píng)價(jià))作者: 徐濤 出版社: 機(jī)械工業(yè)出版社 出版年: 2014-52015年1月19日 贊 回復(fù)添...
摘要:初級(jí)書(shū)單深入理解人評(píng)價(jià)作者徐濤出版社機(jī)械工業(yè)出版社出版年年月日贊回復(fù)添加到豆列來(lái)自豆瓣讀書(shū)響應(yīng)式設(shè)計(jì)人評(píng)價(jià)作者出版社人民郵電出版社出版年年月日贊回復(fù)添加到豆列來(lái)自豆瓣讀書(shū)深入淺出中文版人評(píng)價(jià)作者馬勞克林出版社東南大學(xué)出版社出版年年月 初級(jí)書(shū)單 深入理解Bootstrap 7.0 (65人評(píng)價(jià))作者: 徐濤 出版社: 機(jī)械工業(yè)出版社 出版年: 2014-52015年1月19日 贊 回復(fù)添...
閱讀 2833·2023-04-26 01:00
閱讀 763·2021-10-11 10:59
閱讀 2985·2019-08-30 11:18
閱讀 2684·2019-08-29 11:18
閱讀 1023·2019-08-28 18:28
閱讀 3019·2019-08-26 18:36
閱讀 2138·2019-08-23 18:16
閱讀 1072·2019-08-23 15:56