Dojo 之 面向对象
面向?qū)ο?/strong>三大特性:封裝、繼承、多態(tài)。在熟悉了Java/C#/C++這些高級面向?qū)ο笳Z言的語法結(jié)構(gòu)后,我們或多或少會對javascript腳本語言的面向?qū)ο蟾械揭恍┎贿m,function、prototype、call、apply……
為了消除這種對javascript面向?qū)ο笳Z法的不適,眾多js庫都構(gòu)建了更符合傳統(tǒng)OO編程思想的代碼框架,如prototype、mootools等等,引用mootools文檔中創(chuàng)建對象的例子
| var?Animal?=?new?Class({ initialize:?function(age){ this.age?=?age; } }); var?Cat?=?Animal.extend({ initialize:?function(name,?age){ this.parent(age);?//將調(diào)用Animal的initialize方法; this.name?=?name; } }); var?myCat?=?new?Cat('Micia',?20); alert(myCat.name);?//顯示?'Micia' alert(myCat.age);?//顯示?20 |
Dojo作為一個強大的javascript工具箱,有它自己面向?qū)ο蟮拈_發(fā)方式,用declare解決了對象的創(chuàng)建和繼承的問題,文檔中的例子:
| dojo.declare("my.classes.bar",?my.classes.foo,?{ //?properties?to?be?added?to?the?class?prototype someValue:?2, //?initialization?function constructor:?function(){ this.myComplicatedObject?=?new?ReallyComplicatedObject(); }, //?other?functions someMethod:?function(){ doStuff(); } ); |
declare的第一個參數(shù)是對象名稱,最后一個參數(shù)指定在這個對象里要添加的內(nèi)容,包括函數(shù)和屬性,寫個例子
| dojo.declare("Apple",?null,?{ price:?5, constructor:?function(weight)?{ this.total?=?weight?*?this.price; }, print:?function()?{ alert("The?total?price?is?"?+?this.total); } } ); var?myapple?=?new?Apple(10); myapple.print();?//輸出結(jié)果:"The?total?price?is?50" |
上例通過declare創(chuàng)建了一個Apple對象,javascript本身沒有類的概念,可以使用對象本身來創(chuàng)建新的對象myapple,通過構(gòu)造函數(shù)的參數(shù)值計算蘋果的總價,print函數(shù)輸出結(jié)果,非常形象的構(gòu)建了一個Apple“類”,非常容易理解。要注意的是,這里如果聲明默認構(gòu)造函數(shù),"new Apple(10)"將直接執(zhí)行默認構(gòu)造函數(shù),帶參數(shù)的構(gòu)造函數(shù)就被忽略了,并非C++中順序執(zhí)行。
注意dojo.declare第二個參數(shù),如果創(chuàng)建一個獨立的新對象,可以設(shè)為null,當(dāng)需要從其他一個或多個對象繼承時,則為對象名稱,這樣就方便的實現(xiàn)了對象繼承。多個對象繼承,declare第二個參數(shù)為一數(shù)組,第一個元素為原型父對象,其他的為mixin對象,通過代碼來理解。
創(chuàng)建一個GreenApple對象,測試alert執(zhí)行順序!mixin對象的方法將覆蓋之前對象中的同名函數(shù),除非子對象也聲明了同名函數(shù)print。
| ?//輸出 //"The?height?of?the?tree?is?undefined" //"Getting?a?green?apple" var?gapple?=?new?GreenApple(); //輸出,覆蓋了Apple對象的print //"This?is?an?apple?tree" gapple.print(); //"This?is?a?mixin?class" gapple.additional(); dojo/_base/_loader/bootstrap.js有專門的mixin函數(shù),用于對象的拷貝,將一個創(chuàng)建好的對象拷貝到新的對象中?var?copy?=?dojo.mixin({},?new?Apple(2)); copy.print(); |
print輸出結(jié)果是"The total price is 10",mixin參數(shù)一定是創(chuàng)建好的對象實例,否則出錯!dojo.extend則可以將一個或多個對象的屬性、方法拷貝到一個原型上,通過prototype實現(xiàn)繼承,這是繼承的另外一種方式。
通過declare、mixin、extend,dojo給我們提供了一種方便的對象創(chuàng)建與擴展機制,一般情況下夠用了,感覺還是比較方便,使用時也存在一些限制,翻翻源代碼就能理解。這里主要是要知道dojo是如何面向?qū)ο蟮?#xff0c;方便我們更好的理解dojo基礎(chǔ)功能,及dijit和 dojox,dojo最為強大還是它的widgets。本文涉及的js源碼:
mixin:dojo/_base/_loader/bootstrap.js
extend:dojo/_base/lang.js
declare:dojo/_base/declare.js
總結(jié)
以上是生活随笔為你收集整理的Dojo 之 面向对象的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么卫龙人气这么高?
- 下一篇: 麦乐森海盐芝士棒+推广标题怎么打?