protoype.js學習(一)

          ????? 最近在在學習ajax,自然也就接觸了prototype.js。看了源代碼,感覺代碼的寫的不錯,不過還是比較容易看懂。結合網上的一些資料以及自己的理解,寫了一些注釋 。
          ???
          ??????
          ??1?/**
          ??2??*?定義一個全局對象
          ??3??*/
          ??4?var?Prototype?=?{
          ??5???Version:?'1.4.0',
          ??6???ScriptFragment:?'(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)',
          ??7?
          ??8???emptyFunction:?function()?{},
          ??9???K:?function(x)?{return?x}
          ?10?}
          ?11?
          ?12?/**
          ?13??*?定義一個類的創建模型,其方法create返回一個類,同時回執行一個intialize的初始化方法,即類的構造函數.
          ?14??*?聲明一個類:var?class1=Class.create();
          ?15??*?intialize函數是類的構造函數,當new這個類時便會執行.達到了面向對象中的構造函數的效果.
          ?16??*?intialize方法并沒有定義,相應于一個虛函數,這個虛方法通常實現并不是在派生類中實現的
          ?17??*?而是創建一個完整類后,在其原形對象prototype中定義的
          ?18??*?如:
          ?19??*????????var?X=Class.create();
          ?20??*????????X.prototype={
          ?21??*????????????initialize:?function(userName){
          ?22??*????????????????this.name=userName;
          ?23??*????????????},
          ?24??*????????????show:function(){
          ?25??*????????????????alert(this.name);
          ?26??*????????????}
          ?27??*????????}
          ?28??*????????var?x=new?X('windfree');
          ?29??*????????x.show();????????
          ?30??*?這樣每次創建實例時,initalize方法都會得到執行.從而實現類的構造函數(initalize)和類成員函數(show)一起定義的功能.
          ?31??*?為了能給構造函數傳遞參數,使用了這樣的語句initialize.apply(this,?arguments).實際上arguments是由function()中
          ?32??*?的參數傳遞進來的得,這里巧妙的使用了函數的apply方法,使參數中this指向new的實例對象,而不全局對象Class本身.便調用了實例對象
          ?33??*?的initalize方法.
          ?34??*?
          ?35??*??Class對象實現類似于:
          ?36??*?????????function?Class(){
          ?37??*?????????????create:function(){
          ?38??*?????????????????this.initialize.apply(this,?arguments);
          ?39??*?????????????}
          ?40??*????????}
          ?41??*?
          ?42??*?
          ?43??*?綜述:
          ?44??*?????????實際上可以把Class.create()返回的類看作所有類的共同基類,它在構造函數中調用了一個虛
          ?45??*????????方法initialize,所有繼承于它的類都必須實現這個方法,完成構造函數的功能。
          ?46??
          ?47??*?
          ?48??*/
          ?49?var?Class?=?{
          ?50???create:?function()?{
          ?51?????return?function()?{
          ?52???????this.initialize.apply(this,?arguments);
          ?53?????}
          ?54???}
          ?55?}
          ?56?
          ?57?var?Abstract?=?new?Object();
          ?58?
          ?59?/**
          ?60??*?extend是Object的靜態方法,用于將參數sourece中所有的屬性賦值到distination對象中.
          ?61??*?這里的for?(property?in?source)可以看作是一種反射機制.
          ?62??*?通過反射來實現類似面向對象中的繼承的功能
          ?63??*??例如:
          ?64??*?????????function?class1(){????????????
          ?65??*????????}
          ?66??*????????class1.prototype={
          ?67??*????????????method:function(){?
          ?68??*?????????????????alert("method");?
          ?69??*????????????},?
          ?70??*????????????method2:function(){?
          ?71??*?????????????????alert("method2");?
          ?72??*????????}?
          ?73??*????????}
          ?74??*????????function?class2(){
          ?75??*????????????
          ?76??*????????}
          ?77??*????????//讓class2繼承于class1并定義新成員?
          ?78??*????????class2.prototype=(new?class1()).extend({?
          ?79??*??????????????method:function(){?
          ?80??*???????????????alert("class2");?
          ?81??*?????????????}?
          ?82??*????????});
          ?83??*?
          ?84??*?
          ?85??*/
          ?86?Object.extend?=?function(destination,?source)?{
          ?87???for?(property?in?source)?{
          ?88?????destination[property]?=?source[property];
          ?89???}
          ?90???return?destination;
          ?91?}
          ?92?/**
          ?93??*?返回關于目標對象的文字描述,如果對象實例沒有定義一個inspect函數,默認返回toString函數的值。
          ?94??*/
          ?95?Object.inspect?=?function(object)?{
          ?96???try?{
          ?97?????if?(object?==?undefined)?return?'undefined';
          ?98?????if?(object?==?null)?return?'null';
          ?99?????return?object.inspect???object.inspect()?:?object.toString();
          100???}?catch?(e)?{
          101?????if?(e?instanceof?RangeError)?return?'';
          102?????throw?e;
          103???}
          104?}
          105?
          106?/**
          107??*?返回function的實例,這個實例和源function的結構一樣,
          108??*?但是它已被綁定給了參數中提供的object,就是說,function中的this指針指向參數object。
          109??*?其目的將函數(object)作為一個對象的方法運行
          110??*?__method表示變量是靜態成員,$A()返回一個數組.數組的shift()方法用于返回數組的第一個元素,并把它從數組中刪除.
          111??*/
          112?
          113?Function.prototype.bind?=?function()?{
          114???var?__method?=?this,?args?=?$A(arguments),?object?=?args.shift();
          115???return?function()?{
          116?????return?__method.apply(object,?args.concat($A(arguments)));
          117???}
          118?}
          119?/**
          120??*?bind類似,不同在于其目的將函數(object)作為事件監聽器?
          121??*/
          122?Function.prototype.bindAsEventListener?=?function(object)?{
          123???var?__method?=?this;
          124???return?function(event)?{
          125?????return?__method.call(object,?event?||?window.event);
          126???}
          127?}

          ????? 明天繼續。

          posted on 2006-12-05 13:10 windfree 閱讀(609) 評論(0)  編輯  收藏 所屬分類: javascript
          主站蜘蛛池模板: 安图县| 安乡县| 江川县| 合江县| 赤峰市| 湘乡市| 瓮安县| 株洲县| 明光市| 中阳县| 内丘县| 彭山县| 日照市| 吉隆县| 民权县| 寿阳县| 曲麻莱县| 九江县| 桑日县| 西城区| 宜宾县| 湾仔区| 沂南县| 修文县| 塘沽区| 五河县| 项城市| 六盘水市| 鸡东县| 通州市| 九江市| 抚松县| 临海市| 德清县| 孟州市| 杭锦旗| 武川县| 梅州市| 周宁县| 客服| 徐闻县|