摘要:設(shè)計模式裝飾者模式源碼在不改變對象自身的基礎(chǔ)上,在程序運行期間給對象動態(tài)的添加職責看一個簡單的例子我是函數(shù)我是函數(shù)額外的功能我是函數(shù)我是函數(shù)額外的功能監(jiān)聽數(shù)組的變化監(jiān)聽數(shù)組的變化或者操作函數(shù)等打印監(jiān)聽數(shù)組的變化或者操作函數(shù)等看一個段來自面向
設(shè)計模式 1、裝飾者模式
github源碼
在不改變對象自身的基礎(chǔ)上,在程序運行期間給對象動態(tài)的添加職責
//看一個簡單的例子: Function.prototype.fn = function(fn){ var self = this; return function(){ self.apply(this,arguments); fn.apply(this,arguments); } } function a(){ console.log("我是函數(shù)a"); } var copyA = a.fn(function(){ console.log("我是a函數(shù)額外的功能"); }) copyA(); // 我是函數(shù)a // 我是a函數(shù)額外的功能 //監(jiān)聽數(shù)組的變化 var methods=["push","pop","shift","unshift","splice","slice","sort","reverse"]; var Method = {}; for(var i=0;i 看一個段來自javascript面向?qū)ο缶幊讨改希ǖ诙妫┲嘘P(guān)于裝飾器模式的解釋及其代碼:裝飾器模式是一種結(jié)構(gòu)型模式,它與對象的創(chuàng)建無關(guān),主要考慮的是如何拓展對象的功能。也就是說,除了使用線性式(父-子-孫)繼承方式之外,我們也可以為一個基礎(chǔ)對象創(chuàng)建若干個裝飾對象以拓展其功能。然后,由我們的程序自行選擇不同的裝飾器,并按不同的順序使用它們。在不同的程序中我們可能會面臨不同的需求,并從同樣的裝飾器集合中選擇不同的子集。//裝飾一顆圣誕樹 var tree = {}; tree.decorate = function(){ console.log("tree"); } /*接著,再定義 getDecorator()方法,該方法用于添加額外的裝飾器。裝飾器被實現(xiàn)為構(gòu)造器函數(shù),都繼承自 tree 對象。*/ tree.getDecorator = function(deco){ tree[deco].prototype = this; return new tree[deco]; }; /*下面來創(chuàng)建3個裝飾器,我們將它設(shè)為 tree 的一個屬性(以保持全局命名空間的純凈)。 以下對象也提供了 decorate()方法,注意它先調(diào)用了父類的decorate()方法。*/ tree.Red = function(){ this.decorate = function(){ this.Red.prototype.decorate(); // console.log(this.Red.prototype); // console.log(this.Red.prototype.decorate); console.log("red"); }; this.name = "red"; } tree.Blue = function(){ this.decorate = function(){ this.Blue.prototype.decorate(); // console.log(this.Blue.prototype.decorate); //tree["Blue"]的原型是tree,所以打印出"tree" console.log("blue"); } this.name = "blue"; } tree.Angel = function(){ this.decorate = function(){ this.Angel.prototype.decorate(); // console.log(this.Angel.prototype.decorate); console.log("angle"); } this.name = "angel"; } /*把所有的裝飾器都添加到基礎(chǔ)對象中:*/ tree = tree.getDecorator("Blue"); tree = tree.getDecorator("Angel"); tree = tree.getDecorator("Red"); /*運行:*/ tree.decorate(); //tree //blue //angle //red /*解析: 1、執(zhí)行tree = tree.getDecorator("Blue"): tree["Blue"].prototype = tree; tree = {decorate: ?, name: "blue"} 即tree["Blue"]賦值給tree,tree["Blue"]的原型指向tree 輸出: "tree" "blue" 2、執(zhí)行tree = tree.getDecorator("Angel"): tree["Angel"].prototype = tree["Blue"],(這時候tree已經(jīng)賦值為tree["Blue"]) tree = {decorate: ?, name: "Angle"} 即tree["Angel"]賦值給tree,tree["Angel"]的原型指向tree["Blue"] 輸出: "angel" 3、執(zhí)行tree = tree.getDecorator("Red"): tree["Red"].prototype = tree["Angel"],(這時候tree已經(jīng)賦值為tree["Angel"]) tree = {decorate: ?, name: "Red"} 即tree["Red"]賦值給tree,tree["Red"]的原型指向tree["Angel"] 輸出: "red" */ /* 圖解:從下往上依次繼承 tree = {decorate:fn,getDecorator:fn} | tree["Blue"].prototype//tree={decorate: ?, name: "blue"} | tree["Angel"].prototype//tree={decorate: ?, name: "Angle"} | tree["Red"].prototype//tree={decorate: ?, name: "Red"} */2、觀察者模式(有時也稱為發(fā)布-訂閱模式)看一個段來自javascript面向?qū)ο缶幊讨改希ǖ诙妫┲嘘P(guān)于裝飾器模式的解釋及其代碼:觀察者模式是一種行為型模式,主要用于處理不同對象
之間的交互通信問題。觀察者模式中通常會包含兩類對象。一個或多個發(fā)布者對象:當有重要的事情發(fā)生時,會通知訂閱者。一個或多個訂閱者對象:它們追隨一個或多個發(fā)布者,監(jiān)聽它們的通知,并作出
相應的反應var observer = { addSubscriber:function (callback){//添加訂閱者 if(typeof callback === "function"){ this.subscribers[this.subscribers.length] = callback; } }, removeSubscriber:function (callback){//刪除訂閱者 for(var i=0;iobserver{addSubscriber: ?, removeSubscriber: ?, publish: ?, make:f} if(this.hasOwnProperty(i)){//observer.hasOwnProperty("addSubscriber") -> true o[i] = this[i]; o.subscribers = []; } }//o-> {addSubscriber: ?, removeSubscriber: ?, publish: ?, make:f,subscribers:[],o.XX} } }; //有個函數(shù)blogger和任意一個函數(shù)jack var blogger = { writeBlogPost : function(){ var content = "blogger"; this.publish(content); } }; var jack = { read:function (what){ console.log("jack訂閱: "+what); } }; //blogger變?yōu)榘l(fā)布者 observer.make(blogger); //jack訂閱blogger blogger.addSubscriber(jack.read); //blogger發(fā)布信息 blogger.writeBlogPost(); //輸出:jack訂閱: blogger 最后: 別的函數(shù)也可以成為發(fā)布者, blogger也可以添加任意的函數(shù)為訂閱者 jack也可以訂閱別的發(fā)布者 以上總結(jié)為: 1.指定一個發(fā)布者 2.給發(fā)布者添加緩存列表,存放回調(diào)函數(shù),通知訂閱者 3.發(fā)布信息時,發(fā)布者遍歷緩存表,觸發(fā)存放的回調(diào)函數(shù) 下面看個簡單的例子:var Event = function(){ this.subs = {}; } //添加收聽者: Event.prototype.addSubscriber=function(k,callback){ if(!this.subs[k]){ this.subs[k]=[]; } this.subs[k].push(callback); }; //發(fā)布事件: Event.prototype.publish=function(k,item){ var fns=this.subs[k]; if(fns){//防止發(fā)布給不存在的對象 for(var i=0;i系列文章的目錄: Vue雙向綁定的實現(xiàn)原理系列(一):Object.defineproperty
Vue雙向綁定的實現(xiàn)原理系列(二):設(shè)計模式
Vue雙向綁定的實現(xiàn)原理系列(三):監(jiān)聽器Observer和訂閱者Watcher
Vue雙向綁定的實現(xiàn)原理系列(四):補充指令解析器compile
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/107066.html
摘要:至此監(jiān)聽器和訂閱者功能基本完成,后面再加上指令解析器的功能系列文章的目錄雙向綁定的實現(xiàn)原理系列一雙向綁定的實現(xiàn)原理系列二設(shè)計模式雙向綁定的實現(xiàn)原理系列三監(jiān)聽器和訂閱者雙向綁定的實現(xiàn)原理系列四補充指令解析器 監(jiān)聽器Observer和訂閱者Watcher 實現(xiàn)簡單版Vue的過程,主要實現(xiàn){{}}、v-model和事件指令的功能 主要分為三個部分 github源碼 1.數(shù)據(jù)監(jiān)聽器Obser...
摘要:至此監(jiān)聽器和訂閱者功能基本完成,后面再加上指令解析器的功能系列文章的目錄雙向綁定的實現(xiàn)原理系列一雙向綁定的實現(xiàn)原理系列二設(shè)計模式雙向綁定的實現(xiàn)原理系列三監(jiān)聽器和訂閱者雙向綁定的實現(xiàn)原理系列四補充指令解析器 監(jiān)聽器Observer和訂閱者Watcher 實現(xiàn)簡單版Vue的過程,主要實現(xiàn){{}}、v-model和事件指令的功能 主要分為三個部分 github源碼 1.數(shù)據(jù)監(jiān)聽器Obser...
摘要:并且,由于是在不同的數(shù)據(jù)上觸發(fā)同步,可以精確的將變更發(fā)送給綁定的視圖,而不是對所有的數(shù)據(jù)都執(zhí)行一次檢測。默認值為表示能否修改屬性的值。 了解Object.defineProperty() github源碼 Object.defineProperty()方法直接在一個對象上定義一個新屬性,或者修改一個已經(jīng)存在的屬性, 并返回這個對象。 vueJS采用 ES5 提供的 Object....
摘要:并且,由于是在不同的數(shù)據(jù)上觸發(fā)同步,可以精確的將變更發(fā)送給綁定的視圖,而不是對所有的數(shù)據(jù)都執(zhí)行一次檢測。默認值為表示能否修改屬性的值。 了解Object.defineProperty() github源碼 Object.defineProperty()方法直接在一個對象上定義一個新屬性,或者修改一個已經(jīng)存在的屬性, 并返回這個對象。 vueJS采用 ES5 提供的 Object....
摘要:補充指令解析器源碼補充下節(jié)點類型的知識元素節(jié)點屬性節(jié)點文本節(jié)點節(jié)點實體引用名稱節(jié)點實體名稱節(jié)點處理指令節(jié)點注釋節(jié)點文檔節(jié)點文檔類型節(jié)點文檔片段節(jié)點聲明節(jié)點指令解析器解析節(jié)點,直接固定某個節(jié)點進行替換數(shù)據(jù)的解析模板指令,替換模板數(shù)據(jù)初始化試圖 補充指令解析器compile github源碼 補充下HTML節(jié)點類型的知識: 元素節(jié)點 Node.ELEMEN...
閱讀 2989·2021-11-23 09:51
閱讀 3807·2021-11-22 15:29
閱讀 3256·2021-10-08 10:05
閱讀 1585·2021-09-22 15:20
閱讀 1004·2019-08-30 15:56
閱讀 1102·2019-08-30 15:54
閱讀 763·2019-08-26 11:54
閱讀 2656·2019-08-26 11:32