摘要:介紹本篇主要是介紹創(chuàng)建對(duì)象方面的模式,利用各種技巧可以極大地避免了錯(cuò)誤或者可以編寫(xiě)出非常精簡(jiǎn)的代碼。模式1:命名空間(namespace)命名空間可以減少全局命名所需的數(shù)量,避免命名沖突或過(guò)度。一般我們?cè)谶M(jìn)行對(duì)象層級(jí)定義的時(shí)候,經(jīng)常是這樣的:var app = app || {};app.moduleA = app.moduleA || {};app.moduleA.subModule = app.moduleA.subModule || {};app.moduleA.subModule.MethodA = function () { console.log("print A&quo 閱讀全文
深入理解JavaScript系列(46):代碼復(fù)用模式(推薦篇)
2012-04-24 08:38 by 湯姆大叔, 22279 閱讀, 34 推薦, 收藏,
摘要:介紹本文介紹的四種代碼復(fù)用模式都是最佳實(shí)踐,推薦大家在編程的過(guò)程中使用。模式1:原型繼承原型繼承是讓父對(duì)象作為子對(duì)象的原型,從而達(dá)到繼承的目的:function object(o) { function F() { } F.prototype = o; return new F();}// 要繼承的父對(duì)象var parent = { name: "Papa"};// 新對(duì)象var child = object(parent);// 測(cè)試console.log(child.name); // "Papa"// 父構(gòu)造函數(shù)function Person() 閱讀全文
深入理解JavaScript系列(45):代碼復(fù)用模式(避免篇)
2012-04-23 08:02 by 湯姆大叔, 16929 閱讀, 18 推薦, 收藏,
摘要:介紹任何編程都提出代碼復(fù)用,否則話每次開(kāi)發(fā)一個(gè)新程序或者寫(xiě)一個(gè)新功能都要全新編寫(xiě)的話,那就歇菜了,但是代碼復(fù)用也是有好要壞,接下來(lái)的兩篇文章我們將針對(duì)代碼復(fù)用來(lái)進(jìn)行討論,第一篇文避免篇,指的是要盡量避免使用這些模式,因?yàn)榛蚨嗷蛏儆袔?lái)一些問(wèn)題;第二排是推薦篇,指的是推薦大家使用的模式,一般不會(huì)有什么問(wèn)題。模式1:默認(rèn)模式代碼復(fù)用大家常用的默認(rèn)模式,往往是有問(wèn)題的,該模式使用Parent()的構(gòu)造函數(shù)創(chuàng)建一個(gè)對(duì)象,并且將該對(duì)象賦值給Child()的原型。我們看一下代碼:function inherit(C, P) { C.prototype = new P();}// 父構(gòu)造函數(shù)funct... 閱讀全文
深入理解JavaScript系列(44):設(shè)計(jì)模式之橋接模式
2012-04-19 07:08 by 湯姆大叔, 15136 閱讀, 21 推薦, 收藏,
摘要:介紹橋接模式(Bridge)將抽象部分與它的實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立地變化。正文橋接模式最常用在事件監(jiān)控上,先看一段代碼:addEvent(element, 'click', getBeerById);function getBeerById(e) {var id = this.id;asyncRequest('GET', 'beer.uri?id=' + id, function(resp) {// Callback response.console.log('Requested Beer: ' + resp.respon 閱讀全文
深入理解JavaScript系列(43):設(shè)計(jì)模式之狀態(tài)模式
2012-04-18 06:56 by 湯姆大叔, 13768 閱讀, 17 推薦, 收藏,
摘要:介紹狀態(tài)模式(State)允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變的時(shí)候改變它的行為,對(duì)象看起來(lái)似乎修改了它的類(lèi)。正文舉個(gè)例子,就比如我們平時(shí)在下載東西,通常就會(huì)有好幾個(gè)狀態(tài),比如準(zhǔn)備狀態(tài)(ReadyState)、下載狀態(tài)(DownloadingState)、暫停狀態(tài)(DownloadPausedState)、下載完畢狀態(tài)(DownloadedState)、失敗狀態(tài)(DownloadFailedState),也就是說(shuō)在每個(gè)狀態(tài)都只可以做當(dāng)前狀態(tài)才可以做的事情,而不能做其它狀態(tài)能做的事兒。由于State模式描述了下載(Download)如何在每一種狀態(tài)下表現(xiàn)出不同的行為。這一模式的關(guān)鍵思想就是引入了一個(gè)叫做 閱讀全文
深入理解JavaScript系列(42):設(shè)計(jì)模式之原型模式
2012-04-16 09:11 by 湯姆大叔, 13967 閱讀, 15 推薦, 收藏,
摘要:介紹原型模式(prototype)是指用原型實(shí)例指向創(chuàng)建對(duì)象的種類(lèi),并且通過(guò)拷貝這些原型創(chuàng)建新的對(duì)象。正文對(duì)于原型模式,我們可以利用JavaScript特有的原型繼承特性去創(chuàng)建對(duì)象的方式,也就是創(chuàng)建的一個(gè)對(duì)象作為另外一個(gè)對(duì)象的prototype屬性值。原型對(duì)象本身就是有效地利用了每個(gè)構(gòu)造器創(chuàng)建的對(duì)象,例如,如果一個(gè)構(gòu)造函數(shù)的原型包含了一個(gè)name屬性(見(jiàn)后面的例子),那通過(guò)這個(gè)構(gòu)造函數(shù)創(chuàng)建的對(duì)象都會(huì)有這個(gè)屬性。在現(xiàn)有的文獻(xiàn)里查看原型模式的定義,沒(méi)有針對(duì)JavaScript的,你可能發(fā)現(xiàn)很多講解的都是關(guān)于類(lèi)的,但是現(xiàn)實(shí)情況是基于原型繼承的JavaScript完全避免了類(lèi)(class)的概念。我們 閱讀全文
深入理解JavaScript系列(41):設(shè)計(jì)模式之模板方法
2012-04-13 09:04 by 湯姆大叔, 10383 閱讀, 19 推薦, 收藏,
摘要:介紹模板方法(TemplateMethod)定義了一個(gè)操作中的算法的骨架,而將一些步驟延遲到子類(lèi)中。模板方法使得子類(lèi)可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。模板方法是一種代碼復(fù)用的基本技術(shù),在類(lèi)庫(kù)中尤為重要,因?yàn)樗麄兲崛×祟?lèi)庫(kù)中的公共行為。模板方法導(dǎo)致一種反向的控制結(jié)構(gòu),這種結(jié)構(gòu)就是傳說(shuō)中的“好萊塢法則”,即“別找找我們,我們找你”,這指的是父類(lèi)調(diào)用一個(gè)類(lèi)的操作,而不是相反。具體體現(xiàn)是面向?qū)ο缶幊叹幊陶Z(yǔ)言里的抽象類(lèi)(以及其中的抽象方法),以及繼承該抽象類(lèi)(和抽象方法)的子類(lèi)。正文舉個(gè)例子,泡茶和泡咖啡有同樣的步驟,比如燒開(kāi)水(boilWater)、沖泡(brew)、倒在杯子里( 閱讀全文
深入理解JavaScript系列(40):設(shè)計(jì)模式之組合模式
2012-04-12 08:35 by 湯姆大叔, 13199 閱讀, 17 推薦, 收藏,
摘要:介紹組合模式(Composite)將對(duì)象組合成樹(shù)形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu),組合模式使得用戶對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性。常見(jiàn)的場(chǎng)景有asp.net里的控件機(jī)制(即control里可以包含子control,可以遞歸操作、添加、刪除子control),類(lèi)似的還有DOM的機(jī)制,一個(gè)DOM節(jié)點(diǎn)可以包含子節(jié)點(diǎn),不管是父節(jié)點(diǎn)還是子節(jié)點(diǎn)都有添加、刪除、遍歷子節(jié)點(diǎn)的通用功能。所以說(shuō)組合模式的關(guān)鍵是要有一個(gè)抽象類(lèi),它既可以表示子元素,又可以表示父元素。正文舉個(gè)例子,有家餐廳提供了各種各樣的菜品,每個(gè)餐桌都有一本菜單,菜單上列出了該餐廳所偶的菜品,有早餐糕點(diǎn)、午餐、晚餐等等,每個(gè)餐都有各種各樣 閱讀全文
深入理解JavaScript系列(39):設(shè)計(jì)模式之適配器模式
2012-04-11 09:16 by 湯姆大叔, 15303 閱讀, 26 推薦, 收藏,
摘要:介紹適配器模式(Adapter)是將一個(gè)類(lèi)(對(duì)象)的接口(方法或?qū)傩裕┺D(zhuǎn)化成客戶希望的另外一個(gè)接口(方法或?qū)傩裕?,適配器模式使得原本由于接口不兼容而不能一起工作的那些類(lèi)(對(duì)象)可以一些工作。速成包裝器(wrapper)。正文我們來(lái)舉一個(gè)例子,鴨子(Dock)有飛(fly)和嘎嘎叫(quack)的行為,而火雞雖然也有飛(fly)的行為,但是其叫聲是咯咯的(gobble)。如果你非要火雞也要實(shí)現(xiàn)嘎嘎叫(quack)這個(gè)動(dòng)作,那我們可以復(fù)用鴨子的quack方法,但是具體的叫還應(yīng)該是咯咯的,此時(shí),我們就可以創(chuàng)建一個(gè)火雞的適配器,以便讓火雞也支持quack方法,其內(nèi)部還是要調(diào)用gobble。OK,我們開(kāi) 閱讀全文
深入理解JavaScript系列(38):設(shè)計(jì)模式之職責(zé)鏈模式
2012-04-10 08:55 by 湯姆大叔, 11860 閱讀, 20 推薦, 收藏,
摘要:介紹職責(zé)鏈模式(Chain of responsibility)是使多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求,從而避免請(qǐng)求的發(fā)送者和接受者之間的耦合關(guān)系。將這個(gè)對(duì)象連成一條鏈,并沿著這條鏈傳遞該請(qǐng)求,直到有一個(gè)對(duì)象處理他為止。也就是說(shuō),請(qǐng)求以后,從第一個(gè)對(duì)象開(kāi)始,鏈中收到請(qǐng)求的對(duì)象要么親自處理它,要么轉(zhuǎn)發(fā)給鏈中的下一個(gè)候選者。提交請(qǐng)求的對(duì)象并不明確知道哪一個(gè)對(duì)象將會(huì)處理它——也就是該請(qǐng)求有一個(gè)隱式的接受者(implicit receiver)。根據(jù)運(yùn)行時(shí)刻,任一候選者都可以響應(yīng)相應(yīng)的請(qǐng)求,候選者的數(shù)目是任意的,你可以在運(yùn)行時(shí)刻決定哪些候選者參與到鏈中。正文對(duì)于JavaScript實(shí)現(xiàn),我們可以利用其原型特性來(lái) 閱讀全文
浙公網(wǎng)安備 33010602011771號(hào)