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?}
??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?}
????? 明天繼續。