設(shè)計模式j(luò)avascript面向?qū)ο蟾耪揰第1頁
設(shè)計模式j(luò)avascript面向?qū)ο蟾耪揰第2頁
設(shè)計模式j(luò)avascript面向?qū)ο蟾耪揰第3頁
設(shè)計模式j(luò)avascript面向?qū)ο蟾耪揰第4頁
設(shè)計模式j(luò)avascript面向?qū)ο蟾耪揰第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、基于原型的 OOP 和基于靜態(tài)類的方式直接有很多差異。 讓基于原型的 OOP 和基于靜態(tài)類的方式直接有很多差異。 讓基于類特性和基將在 JavaScript 里將“類與原型”的重點(diǎn)是靜態(tài)類和動態(tài)原型(sics + classes vs. dynamics + prototypes),確切地說,一個靜態(tài)類(例如:C + +,JAVA)和他的屬下及方法定義的機(jī)類與(type)或分類(classification)例如(這里和下面的例子都是偽代碼CClassa,b,cC,ab,概論、在進(jìn)ECMAScriptOOP 技術(shù)分析之前, 有必要掌OOP 基本的特征,并ECMAScript 支持包括結(jié)構(gòu)化、面

2、 象、函數(shù)式、命令式等多種編程方式,某些情況下還支持面向方面編程;但本文是 面 象編程,所以來給出 ECMAScript 中面 象子類包含了繼承鏈中所有的屬性(即使其中的某些屬性是子類不需要的子類包含了繼承鏈中所有的屬性(即使其中的某些屬性是子類不需要的創(chuàng)建類實例,類不能(因為靜態(tài)模型)來改變其實例的特征(屬性或方法了狀態(tài) (即在一個C = Class a, b, c, method1, c1a:10,b:20,c:30Cc2a:50,b:60,c:70C2,(也就是屬性值層次(分層)D=ClassextendsC=d,e/a,b,c,d,e d1 = a: 10, b: 20, c: 30,

3、 d: 40, e: 50d1.method1() / D.method1 (no) - C.method1 (yes) d1.method5()/D.method5(no)-C.method5(no)-noresult過去了,D的結(jié)構(gòu)是a,b,c,d,e 。然而,方method1,method2是沒有基于類的關(guān)鍵讓 看看在 JavaScriptOOP模型,也就是 所建議的基于原型的 OOP讓 看看在 JavaScriptOOP模型,也就是 所建議的基于原型的 OOP言有直接關(guān)系。下面這樣的對象可以獨(dú)立 他們所有的特性(屬性,方法)而不需要的object=a:10,b:20,c:30,meth

4、od:fn; object.a; / 10object.c; / 30 object.method5functionobject.d = 40; / 添加新屬性 d deleteobject.c; object.a = 100; / 修改屬性 / 結(jié)果是: object: a: 100, b: 20, d: 40, method: fn, method5: 基于在 ECMAScript 中例(偽代碼6. 實例(因為嚴(yán)格的靜態(tài)模型)除了有該實例所對應(yīng)類x = a: 10, b: y = a: 40, c: y.Prototypex;x = a: 10, b: y = a: 40, c: y.Pr

5、ototypex;x 是yy.a;40,y.c;50,y.b; / 20 從原型中獲取: y.b (no) - y.Prototype.b (yes): delete y.a; / 刪除自身的y.a;10z = a: 100, e: y.a; / 100 從原型 z 中獲取y.e50,zz.q200y.q個委托的原型() 。 的機(jī)制在這里稱為發(fā)送信息到對象上,如果鏈。 鏈也像靜態(tài)類中分層次的,但是它可以很容易地重新排列,改變層次和結(jié)構(gòu)。x = a: y = b: y.Prototype = z = c: z.Prototype = z.a / z.a/ z.a (no) -/ z.Protot

6、ype.a (no) -/ z.Prototype.Prototype.a (yes): doesNotUnderstand,Ruby 中的 中call;和ECMAScript 中 doesNotUnderstand,Ruby 中的 中call;和ECMAScript 中 var object = ethod :function(name,alert(name,args); if (name = test) return .test() method is return delegatename.apply(this, var delegate = square:function(a) ret

7、urn a * alert(object.square(10); / 100 alert(object.test();/.test()methodishandledConcatenative 老實說,有必要在說句話關(guān)于另外一種情況(盡快在 ECMASCript 沒有用到):當(dāng)原型 對象是完全動態(tài)可變的(理論上完全可以從一個類型轉(zhuǎn)化到另一個類型在運(yùn)行時隨時可以改變對象的原型在基于委托的模型中,改變原型的特點(diǎn),將影響到與該原型相關(guān)的所有對象對象是完全動態(tài)可變的(理論上完全可以從一個類型轉(zhuǎn)化到另一個類型在運(yùn)行時隨時可以改變對象的原型在基于委托的模型中,改變原型的特點(diǎn),將影響到與該原型相關(guān)的所有對象的

8、模型中,這個改變不會改變現(xiàn)有存在的對象行為,而是改變它的原型特性)Duck 類類型(類)無關(guān),而是是否能夠相應(yīng)消息有關(guān)(須的)if (object instanceof SomeClass) /因為突變、類型、特性可if(isFunction(object.test)/ECMAScript if object.respond_to?(:test) / Rubyif hasattr(object, test): 基于原型的關(guān)不過,還有一個模型, 也應(yīng)該考慮。認(rèn)為,在上面例子里展示的區(qū)別“類VS 不過,還有一個模型, 也應(yīng)該考慮。認(rèn)為,在上面例子里展示的區(qū)別“類VS 原型 ”在這個基于動態(tài)類的模型

9、中不是那么重或Ruby(或其他類似的語言)。 這些語言都使用基于動態(tài)類的范式。 然而,在某些方面,在下面例子中, 可以看到僅僅是基于委托的原型, 可以放大一個類(原型),從而影響到所有與這個類相關(guān)的對象, 也可以在運(yùn)行時動態(tài)地改變這個對象的類(為委#class def init (self,a): self.a = adef return self.a * aA(10)(a.a) # A.b20(a.b)#20可以在a實例a.b30a(a.b) # dela.b(a.b) # 20 - 再次從類里獲取(原型如果不能響應(yīng)消息,它的調(diào)用者可以采取額外的措施(例如,改變調(diào)度classB(object

10、):B bB()classB(object):B bB()Bb. class = A # 動態(tài)改變類(原型b.a10(b.square()100AdelA del #但對象依然有隱式(b.square() # b. = dict # 中,與 Ruby 和ECMAScript 的對比,放大類(原型的JavaScript 的文章往往會文這些可能會說“JavaScript 是不同OOP 實現(xiàn)的其它簡要介紹一下其它特性和各種 OOP 實現(xiàn)中關(guān)于代碼重用的方式,也包括 ECMAScript中的OOP實現(xiàn)。原因是,之前出現(xiàn)的關(guān)于JavaScript中關(guān)于OOP的實現(xiàn)在 ECMAScript 中對象有幾種含

11、義的在 ECMAScript 中對象有幾種含義的多態(tài)性function test.call(a: 10, b: 20); / 10, test.call(a: 100, b: 200); / 100, vara=1; var b = alert(Dtotype.getTime.call(new Date(); / time alert(Dtotype.getTime.call(newString();/TypeError組的.sort排序方法和它的參數(shù)多態(tài)的排序功能)。順便說一下,上面的例子也可以被(簽名),多個實現(xiàn)”)多態(tài)性和 上面提到的 Duck 類型是有關(guān)的:即對象的類型和在層次結(jié)構(gòu)中的

12、位置不是關(guān)于封裝,往往會有錯誤的看法。本節(jié) 一下一些OOP 實現(xiàn)里的語法糖也就是飾符:private,protected 和 public(或者稱為對象的級別和 public),為了方便編程在級別和 public),為了方便編程在很多象里都已經(jīng)實現(xiàn)和 Ruby)。一方面(private _protected 屬性(通過下劃線這個命名規(guī)范),從外部不可class def init (self): self.public = self. private = def get_private(self): returnself. private# aA()A(a.public) # OK, (a.ge

13、t_private()#OK,(a. privateAprivate) # OK, 法(例如d等)獲取封裝的數(shù)據(jù)class a = 10def public_method defreturn a + aA.newaA.newa.public_method # OK, a.aaa.private_methoda.send(:private_method, 20) # OK, 30 a.instance_variable_get(:a)#OK,10慣和風(fēng)格 ,因為通常值用公共的 API 來和對象“交談”。藏數(shù)據(jù)。 更嚴(yán)重的,封裝不是用 private 修飾數(shù)據(jù)而達(dá)到抽象的語句“HTML是如下內(nèi)容”

14、innerHTML屬性的 封裝的概念不僅僅只與 OOP 相關(guān)。 例如,它可以是一個簡單的功能,只封裝了各種計 算,使得其抽象(Math.round( ) 生偽絕對非抽象的實體設(shè)置“getter / setter 方法”(我再說一遍,它是錯誤的):function A() var _a; / private a this.getA=function_getA()return this.setA = function _setA(a) _a = vara=newA(); alert(a._a);/undefined,private alert(a.getA(); / 10致內(nèi)存增加的原因(和原型定

15、義相比)。 雖然,理論上第一種情況下可以對對象進(jìn)行優(yōu)JS 是 的語言對象是完全可他則 )。JavaScript 里,如果還是把封裝曲解成為了不讓 在某些自動寫入某些值 “隱藏”eval函數(shù)(S erMonkey1.7 上測試)eval(_a100,a.getA);a.setA,因為_a兩個方法的上a.getA(); / / var foo = (function varx=10;/ privatereturn function () pr foo(); / .x = / var foo = (function varx=10;/ privatereturn function () pr foo

16、(); / .x = 相比,這里只是命名規(guī)范var _myPrivateData = (function () ECMAScript 不支持多繼承(即只有一個對象,可以用來作為一個直接原型),雖然其(erMonkey)使MixinsMixinsMixins)。 ECMA-262-3 規(guī)范沒有定義“Mixins”的概念,但根據(jù) Mixins 定義以/ helper for Object.extend = function (destination, source) / helper for Object.extend = function (destination, source) for(pr

17、opertyinsource)if destinationproperty = return var X = a: 10, b: var Y = c: 30, d: Object.extend(X, Y); / mix Yo X alert(X.a,X.b,X.c,X.d);10,20,30,40規(guī)范里并沒有這樣的概念,而且不是mix 而是常用的通過新特性去擴(kuò)展對象。(Ruby 中 mixins 的概念是定義的,mixin 創(chuàng)建了一個包含模塊的一個Traitsmixins的概念相似,但它有很多功能(mixins 所以不能包含狀態(tài),因為它有可能導(dǎo)致命名 )ECMAScript Traits mi

18、xins 遵在一OOP 中實現(xiàn)的接mixins traits 類似。然而,與mixins traits 相比,接口已經(jīng)提到已經(jīng)提到var _delegate foo:functionvar agregate delegate:_delegate, foo: function () return agregate.foo();/delegate.foo agregate.delegate = foo: function () alert(foo from new AOP 作為面向方面的一個功能,可以使用functiondecorators。ECMA-262-3規(guī)格沒有明確定義的“function decorators”的概念(和 相對,這個詞是在function return functio

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論