摘要:應(yīng)用場景一個的構(gòu)造函數(shù),提供創(chuàng)建不同類型汽車的方法。優(yōu)點(diǎn)保護(hù)全局命名空間免受污染,能很快地找到相應(yīng)的構(gòu)造函數(shù)。如果構(gòu)造函數(shù)不存在,報(bào)錯原型繼承父類,且只繼承一次迭代器模式定義按順序訪問一個聚合對象中各個元素。
1. 單例模式
定義:一個特定類 僅有一個實(shí)例
應(yīng)用場景: 一個遮罩層
實(shí)現(xiàn)方式
每個對象都是一個單體,因?yàn)樗麄兊囊梦恢貌灰粯樱?/p>
使用new操作符
將首次生成的對象存儲在全局變量中。缺點(diǎn):全局變量易被覆蓋。可以使用閉包來存儲這個變量,參見 一個遮罩層。
在構(gòu)造函數(shù)的屬性中存儲該實(shí)例。缺點(diǎn):構(gòu)造函數(shù)的屬性也容易被修改。
function Universe() { if (typeof Universe.instance === "object") { return Universe.instance } this.start_time = 0; this.bang = "Big"; Universe.instance = this; } var uni1 = new Universe(); var uni2 = new Universe(); console.log(uni1 === uni2); // true
- 重寫構(gòu)造函數(shù),使用閉包來儲存這個實(shí)例。缺點(diǎn):
//缺點(diǎn): 這種方式會丟掉初始實(shí)例與重寫構(gòu)造函數(shù)之間的關(guān)系,因此后面再向重寫的構(gòu)造函數(shù)原型中添加屬性時,并不會添加到初始實(shí)例中去。 function Universe() { var instance = this; this.start_time = 0; this.bang = "Big"; Universe = function Universe() { return instance; } } Universe.prototype.nothing = true; var uni1 = new Universe(); Universe.prototype.everything = true; var uni2 = new Universe(); console.log(uni1 === uni2); //true console.log(uni1.nothing); //true console.log(uni2.nothing); //true console.log(uni1.everything); //undefined console.log(uni2.everything); //undefined console.log(uni1.constructor === Universe); //false
因此,我們需要先重寫構(gòu)造函數(shù)、保留原型屬性、生成實(shí)例,返回實(shí)例。
function Universe() { var instance; Universe = function () { return instance; } Universe.prototype = this; instance = new Universe(); instance.constructor = Universe; this.start_time = 0; this.bang = "big"; return instance; } Universe.prototype.nothing = true; var uni1 = new Universe(); Universe.prototype.everything = true; var uni2 = new Universe(); console.log(uni1 === uni2); //true console.log(uni1.nothing); //true console.log(uni2.nothing); //true console.log(uni1.everything); //true console.log(uni2.everything); //true console.log(uni1.constructor === Universe); //true
- 還有一種就是使用即時函數(shù)
var Universe; (function () { var instance; Universe = function () { if (instance) { return instance; } instance = this; this.start_time = 0; this.bang = "big"; } })(); Universe.prototype.nothing = true; var uni1 = new Universe(); Universe.prototype.everything = true; var uni2 = new Universe(); console.log(uni1 === uni2); //true console.log(uni1.nothing); //true console.log(uni2.nothing); //true console.log(uni1.everything); //true console.log(uni2.everything); //true console.log(uni1.constructor === Universe); //true2. 工廠模式
定義: 提供創(chuàng)建相似對象的可重用方法。在不確定的情況下,提前提供一種創(chuàng)建某類的方法。總-分模式。
應(yīng)用場景:一個CarMaker的構(gòu)造函數(shù),提供創(chuàng)建不同類型汽車的factory方法。
實(shí)現(xiàn)方式。優(yōu)點(diǎn):保護(hù)全局命名空間免受污染,能很快地找到相應(yīng)的構(gòu)造函數(shù)。
function CarMaker() {} CarMaker.prototype.getPrice = function () { console.log("Price:", this.price); } CarMaker.factory = function (type) { var newcar; //如果構(gòu)造函數(shù)不存在,報(bào)錯 if (typeof CarMaker[type] !== "function") { throw { name: "Error", message: type + " dosen"t exist" } } //原型繼承父類,且只繼承一次 if (typeof CarMaker[type].prototype.getPrice !== "function") { CarMaker[type].prototype = new CarMaker(); } newcar = new CarMaker[type](); return newcar; } CarMaker.SUV = function () { this.price = 100; } CarMaker.Compat = function () { this.price = 50; } var a = CarMaker.factory("SUV"); var b = CarMaker.factory("Compat"); a.getPrice(); //Price: 100 b.getPrice(); //Price: 1003. 迭代器模式
定義:按順序訪問一個聚合對象中各個元素。通常包含next(獲取下一個元素), hasNext(是否到末尾),rewind(重置初始位置), current(當(dāng)前元素)集中方法。
應(yīng)用場景:需要按照順序,以不同的間隔獲取集合中的元素。
實(shí)現(xiàn)方法:
function iterator (data = [], gap = 1) { var index = 0, //記錄當(dāng)前位置 length = data.length; //數(shù)據(jù)總長度 return { next() { var element; if (!this.hasNext()) { return null; } element = data[index]; index += gap; return element; }, hasNext() { return index < length; }, rewind() { index = 0; }, current() { return data[index]; } } } var arrIterator = iterator([1, 2, 3, 4, 5]); while(arrIterator.hasNext()) { console.log(arrIterator.next()); } arrIterator.rewind(); console.log(arrIterator.current());4. 裝飾者模式
定義: 在運(yùn)行時動態(tài)添加附加功能到對象中。
應(yīng)用場景:購買某種東西時,隨著添加不同的裝備,價(jià)格也不一樣。最后需要根據(jù)添加的設(shè)備計(jì)算總價(jià)。
實(shí)現(xiàn)方法:要注意的是,各裝飾器需要提供原型方法的接口。 另一種實(shí)現(xiàn)方式
function Sale(price = 100) { this.price = price; this.decorators_list = []; } //裝飾器 Sale.decorators = {}; Sale.decorators.pack = { getPrice(price) { return price + 20; } } Sale.decorators.mail = { getPrice(price) { return price + 10; } } Sale.prototype.decorate = function (decorator) { this.decorators_list.push(decorator); } Sale.prototype.getPrice = function () { let price = this.price; //調(diào)用各裝飾器的接口 for (let i = 0, len = this.decorators_list.length; i < len; i++) { name = this.decorators_list[i]; price = Sale.decorators[name].getPrice(price); } return price; } var sale = new Sale(); sale.decorate("pack"); sale.decorate("mail"); console.log(sale.getPrice()); //1305. 策略者模式
定義:在運(yùn)行時可以選擇算法。
應(yīng)用場景:表單驗(yàn)證。
實(shí)現(xiàn)方式:一個含有config(配置驗(yàn)證規(guī)則), types(驗(yàn)證類型), validate(驗(yàn)證方法), message(結(jié)果消息數(shù)組), hasErrors(最后結(jié)構(gòu))幾個屬性的validator對象。
6. 外觀模式定義:提供一個高級接口,調(diào)用經(jīng)常需要同時使用的幾個基礎(chǔ)方法。
應(yīng)用場景:將stopPropagation與peventDefault包裝在stop這個高級接口中。
7. 代理模式飯?zhí)玫某床藥煾挡粫驗(yàn)槟泐A(yù)定了一份燒鴨和一份白菜就把這兩樣菜炒在一個鍋里。他更愿意給你提供一個燒鴨飯?zhí)撞汀M瑯釉诔绦蛟O(shè)計(jì)中,我們需要保證函數(shù)或者對象盡可能的處在一個合理粒度,畢竟不是每個人喜歡吃燒鴨的同時又剛好喜歡吃白菜。
外觀模式還有一個好處是可以對用戶隱藏真正的實(shí)現(xiàn)細(xì)節(jié),用戶只關(guān)心最高層的接口。比如在燒鴨飯?zhí)撞偷墓适轮校悴⒉魂P(guān)心師傅是先做燒鴨還是先炒白菜,你也不關(guān)心那只鴨子是在哪里成長的。
定義:介于對象和對象的客戶端之間,對對象本體起保護(hù)作用,使本體對象做盡可能少的工作。目的是解決性能問題。
應(yīng)用場景:
初始化本體對象消耗非常大,但是在初始化該對象的之后并未使用。此時可使用代理模式,接收初始化請求,返回ok,等真正用到本體對象時再初始化。
發(fā)起Http請求會消耗性能,最好的方法就是使用代理合并Http請求,比如將50ms內(nèi)的發(fā)起的請求合并為一個請求。
為了減少性能消耗,還可給代理設(shè)置一個緩存,緩存結(jié)果。
fragment應(yīng)該就算一個代理模式吧,緩存了對DOM的操作。
實(shí)現(xiàn)方法:對象客戶端調(diào)用代理提供的方法,代理對客戶端的請求進(jìn)行處理后調(diào)用對象本體方法。
8. 中介者模式定義:一個程序中有很多對象,這些對象之間會相互通信。但是如果修改其中一個對象,則必然會牽涉到其他和他通信的對象,造成緊耦合。中介者模式就是提出一個中間對象來實(shí)現(xiàn)對象間的松耦合通信。通信的對象不用知道對方是誰,只要有變動就通知給這個中介者,中介者知道所有的對象并且負(fù)責(zé)聯(lián)系相應(yīng)的對象做出處理。
應(yīng)用場景:MVC中的Controller
實(shí)現(xiàn)方法:http://www.jspatterns.com/boo...
9. 觀察者模式定義:該模式的目的也是為了形成松耦合。對象之間不直接調(diào)用彼此的方法,而是采取訂閱的模式,訂閱者訂閱發(fā)布者的事件,并向發(fā)布者提供一個事件發(fā)生時調(diào)用的方法。中介者模式中的mediator需要知道所有其他對象,而該模式并不需要知道,只要訂閱事件即可。
應(yīng)用場景:DOM中的事件。
實(shí)現(xiàn)方法:
發(fā)布者需要:訂閱者的列表{type: []},訂閱方法, 取消訂閱,發(fā)布消息幾種方法。http://www.jspatterns.com/boo...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/86910.html
摘要:設(shè)計(jì)模式是以面向?qū)ο缶幊虨榛A(chǔ)的,的面向?qū)ο缶幊毯蛡鹘y(tǒng)的的面向?qū)ο缶幊逃行┎顒e,這讓我一開始接觸的時候感到十分痛苦,但是這只能靠自己慢慢積累慢慢思考。想繼續(xù)了解設(shè)計(jì)模式必須要先搞懂面向?qū)ο缶幊蹋駝t只會讓你自己更痛苦。 JavaScript 中的構(gòu)造函數(shù) 學(xué)習(xí)總結(jié)。知識只有分享才有存在的意義。 是時候替換你的 for 循環(huán)大法了~ 《小分享》JavaScript中數(shù)組的那些迭代方法~ ...
摘要:請記住,這些書中的一些可能不是最新的,但概念和基礎(chǔ)仍應(yīng)適用。是最好的老師之一。的秘密由部分組成。在你完成這些書后,查看書籍和最好的本土?xí)? 我看過三本,第1本,第二本,第四本。第一本買的的實(shí)體書,其他兩本看的是電子書。第一本是大名鼎鼎老道寫的,書很薄,但是非常經(jīng)典。javascirpt忍者秘籍是jquery的作者寫的,也是非常經(jīng)典。you dont kown js系列也是非常好。看了...
摘要:是文檔的一種表示結(jié)構(gòu)。這些任務(wù)大部分都是基于它。這個實(shí)踐的重點(diǎn)是把你在前端練級攻略第部分中學(xué)到的一些東西和結(jié)合起來。一旦你進(jìn)入框架部分,你將更好地理解并使用它們。到目前為止,你一直在使用進(jìn)行操作。它是在前端系統(tǒng)像今天這樣復(fù)雜之前編寫的。 本文是 前端練級攻略 第二部分,第一部分請看下面: 前端練級攻略(第一部分) 在第二部分,我們將重點(diǎn)學(xué)習(xí) JavaScript 作為一種獨(dú)立的語言,如...
摘要:首先,需要來理清一些基礎(chǔ)的計(jì)算機(jī)編程概念編程哲學(xué)與設(shè)計(jì)模式計(jì)算機(jī)編程理念源自于對現(xiàn)實(shí)抽象的哲學(xué)思考,面向?qū)ο缶幊淌瞧湟环N思維方式,與它并駕齊驅(qū)的是另外兩種思路過程式和函數(shù)式編程。 JavaScript 中的原型機(jī)制一直以來都被眾多開發(fā)者(包括本人)低估甚至忽視了,這是因?yàn)榻^大多數(shù)人沒有想要深刻理解這個機(jī)制的內(nèi)涵,以及越來越多的開發(fā)者缺乏計(jì)算機(jī)編程相關(guān)的基礎(chǔ)知識。對于這樣的開發(fā)者來說 J...
摘要:函數(shù)式編程前端掘金引言面向?qū)ο缶幊桃恢币詠矶际侵械闹鲗?dǎo)范式。函數(shù)式編程是一種強(qiáng)調(diào)減少對程序外部狀態(tài)產(chǎn)生改變的方式。 JavaScript 函數(shù)式編程 - 前端 - 掘金引言 面向?qū)ο缶幊桃恢币詠矶际荍avaScript中的主導(dǎo)范式。JavaScript作為一門多范式編程語言,然而,近幾年,函數(shù)式編程越來越多得受到開發(fā)者的青睞。函數(shù)式編程是一種強(qiáng)調(diào)減少對程序外部狀態(tài)產(chǎn)生改變的方式。因此,...
摘要:前端入門的門檻相對較低,學(xué)習(xí)曲線是越來越陡峭,由淺入深,可以分為四個階段。第二階段高級程序設(shè)計(jì)有的書是用來成為經(jīng)典的,比如犀牛書還有些書是用來超越經(jīng)典的,顯然這本書就是。接下來可以看看教程,看看源代碼,嘗試著寫一寫這些效果。 前端入門的門檻相對較低,學(xué)習(xí)曲線是越來越陡峭,由淺入深,可以分為四個階段。 第一階段:《JavaScript DOM編程藝術(shù)》 看這本書之前,請先確認(rèn)你對J...
閱讀 2238·2021-11-17 09:33
閱讀 2782·2021-11-12 10:36
閱讀 3403·2021-09-27 13:47
閱讀 891·2021-09-22 15:10
閱讀 3492·2021-09-09 11:51
閱讀 1397·2021-08-25 09:38
閱讀 2760·2019-08-30 15:55
閱讀 2611·2019-08-30 15:53