類之Prototype.js學(xué)習(xí)
Prototype.js作為javascript的成功的開(kāi)源框架,封裝了很多好用的功能,雖然官方?jīng)]提供什么文檔,不過(guò)在google上一搜,好多相關(guān)的文檔,不過(guò)在學(xué)習(xí)使用的過(guò)程中還是碰到了一些問(wèn)題,希望熟悉的朋友能多加指點(diǎn),對(duì)于prototype.js學(xué)習(xí)我關(guān)注這么幾點(diǎn),同時(shí)針對(duì)每點(diǎn)也講講學(xué)習(xí)的結(jié)果和碰到的問(wèn)題,^_^
1、類的創(chuàng)建
prototype.js已經(jīng)封裝好了,這個(gè)很簡(jiǎn)單。
var Person=Class.create();
這樣就創(chuàng)建了一個(gè)Person類,這個(gè)Person類必須提供initialize方法的實(shí)現(xiàn):
Person.prototype={
initialize:function(){
}
};
對(duì)比java,Class.create相當(dāng)于Class.forName(),initialize相當(dāng)于構(gòu)造器,和java的構(gòu)造器一樣,可以自定義為帶參數(shù)性質(zhì)的。
可以看到在使用這樣的方式定義class后,它和javascript原來(lái)的通過(guò)function方式來(lái)定義一個(gè)類就有明確的區(qū)分了,在這種情況下我們就可以用Class.create來(lái)定義類,用function來(lái)直接定義函數(shù)。
類通常還涉及靜態(tài)成員(static性質(zhì)的)和實(shí)例成員(需要實(shí)例化才可調(diào)用)的定義。
在javascript中這點(diǎn)也非常容易:
靜態(tài)成員:
var Person={
name:'person',
getName:function(){return 'person'}
};
實(shí)例成員:
Person.prototype={
childname:'child',
eat:function()
}
上面的Person.getName是可以直接這么調(diào)用的,但eat方法則需通過(guò)var person=new Person();person.eat();的方式來(lái)調(diào)用。
2、類的繼承
類的繼承其實(shí)javascript本身就支持的,不過(guò)prototype提供了一種另外的方法。
按照javascript的支持的實(shí)現(xiàn):
var Student=Class.create();
Student.prototype=new Person();
這樣就實(shí)現(xiàn)了Student繼承至Person。
在使用prototype的情況下可以這么實(shí)現(xiàn):
var Student=Class.create();
Object.extend(Student.prototype,Person.prototype);
子類要增加方法時(shí)可使用
Student.prototype.study=function(){};
或
Object.extend(Student.prototype,{
study:function(){}
});
3、事件機(jī)制(對(duì)類方法執(zhí)行的監(jiān)聽(tīng)和觀察)
在事件機(jī)制上則碰到了一些疑惑,作為事件機(jī)制主要需要提供事件的定義,對(duì)于事件的監(jiān)聽(tīng)以及對(duì)于事件的觀察。
在javascript中事件需要以on開(kāi)頭,也就是作為事件就需要采用onclick這樣類似的命名:
對(duì)上面的Student增加一個(gè)對(duì)外的事件,如:
Student.prototype.study=function(){
this.onstudy();
}
Student.prototype.onstudy=function(){};
這個(gè)onstudy就是交給相應(yīng)的實(shí)例去實(shí)現(xiàn)的,例如實(shí)例采用這樣的方式:
function studyThis(){
alert("study this");
}
var student=new Student();
student.onstudy=studyThis();
對(duì)于事件通常都希望進(jìn)行監(jiān)聽(tīng)和觀察,根據(jù)prototype提供的bindAsEventListener以及Observe,這么進(jìn)行了嘗試:
study.onstudy=watchStudy.bindAsEventListener(this);
function watchStudy(event){
alert("watch study");
}
按照事件機(jī)制來(lái)說(shuō),在執(zhí)行study的時(shí)候應(yīng)該可以看到study this和watch study兩個(gè)提示,但最后執(zhí)行后只能看到watch study的提示,這是為什么呢?按照l(shuí)istener的概念的話,不應(yīng)該覆蓋原有方法的,不過(guò)我看了一下prototype.js的源代碼,按照上面的編寫方式確實(shí)會(huì)照成覆蓋原方法。
Observe是這么嘗試的:
Event.observe(study,'study',watchStudy,false);
按照觀察機(jī)制來(lái)說(shuō),應(yīng)該在執(zhí)行study的時(shí)候會(huì)看到兩個(gè)提示,但最后執(zhí)行后這行根本就沒(méi)起到任何作用。
這是為什么呢?
相關(guān)文章
Prototype源碼淺析 Enumerable部分之each方法
在javascript中,根本找不到Enumerable的影子,因?yàn)檫@一塊是Prototype作者從Ruby中借鑒過(guò)來(lái)的。2012-01-01Prototype Template對(duì)象 學(xué)習(xí)
這里的Template對(duì)象其實(shí)就是格式化字符串的工具,就像java中的String.format方法。這個(gè)對(duì)象只提供一個(gè)方法evaluate。2009-07-07初學(xué)prototype,發(fā)個(gè)JS接受URL參數(shù)的代碼
初學(xué)prototype,發(fā)個(gè)JS接受URL參數(shù)的代碼...2007-01-01Prototype 工具函數(shù) 學(xué)習(xí)
Prototype學(xué)習(xí)工具函數(shù)$H,$R,Try.these,document.getElementsByClassName2009-07-07Prototype Object對(duì)象 學(xué)習(xí)
該不是一個(gè)概念。因?yàn)镃#中的命名空間后面不會(huì)直接跟方法,肯定是接一個(gè)對(duì)象然后在調(diào)用方法,不過(guò)和C++中的命名空間倒是有些類似2009-07-07Prototype ObjectRange對(duì)象學(xué)習(xí)
ObjectRange對(duì)象基本就是實(shí)現(xiàn)了連續(xù)的數(shù)字或者字符串,其中只包含一個(gè)方法,include,判斷某個(gè)數(shù)字或者字符串是否在ObjectRange里。并且ObjectRange對(duì)象還混入了Enumerable的方法,所以可以直接在ObjectRange對(duì)象上調(diào)用Enumerable對(duì)象里面的方法。2009-07-07