Javascript Object.extend
2024-05-06 14:09:59
供稿:網(wǎng)友
既然是類,那么就有抽象類,具體類,類的繼承,同時,類的成員可以有實(shí)例成員和靜態(tài)成員。下面來看一下prototype是怎么做到這些的。
先看prototype中的以下的代碼:
代碼如下:
var Abstract = new Object();
Object.extend = function(destination, source) {
for (property in source) {
destination[property] = source[property];
}
return destination;
}
Object.prototype.extend = function(object) {
return Object.extend.apply(this, [this, object]);
}
第一個聲明了一個對象Abstract,Object其實(shí)是一個函數(shù),他沒有任何成員,所以是一個空類,所以Abstract也就沒有任何成員。這個暫時不說,后面可以看到這是抽象類的基礎(chǔ)。先解釋以下這個語法:
function.member=function(){}
在這種情況下,function一般都是已經(jīng)定義過的,這條語句的作用是給function增加一個靜態(tài)成員member,member的內(nèi)容是等號后面的。如上面第二段代碼Object.extend=……,就是給Object這個類增加了一個靜態(tài)方法extend。ok,我們知道了怎樣給一個類定義靜態(tài)成員,那么你一定很想知道實(shí)例成員怎么定義,很簡單,在類名和成員名之間加上prototype:
function.prototype.member=function(){}
prototype不僅可以這么使用,還可以:
代碼如下:
function.prototype={
member1:function(){……},
member2:"abc",
member3:function(){……}
}
這樣就是實(shí)現(xiàn)了實(shí)例成員的定義。但prototype代表什么意思呢?在第一篇我說過,直接用{}括起來,表示一個對象,如Prototype,Class都是這樣定義的全局對象。而看下面一種用法,prototype后面就是一個{}的結(jié)構(gòu),難道它也是對象?是的,沒錯,prototype其實(shí)也是一個對象!在javascript里,一個對象我們可以任意增加它的成員,用如下的語法:
object.member=function(){……};
只要經(jīng)過這樣的定義,一個對象就可以立刻具有member這個方法!javascript就是這么神奇!
好,我們現(xiàn)在知道了prototype是一個對象,而function是一個函數(shù)或者類,那么我們可以認(rèn)為prototype是任何一個類(函數(shù))都內(nèi)部保留的一個靜態(tài)成員。它的功能就是存儲這個類的所有成員指針,但這些成員都只是原型,沒有經(jīng)過初始化,這也符合prototype的原義。你可以隨時通過prototype這個對象來擴(kuò)充成員。在new一個類時,prototype的成員就經(jīng)過初始化,然后賦給了實(shí)例化的對象。
上面第三段代碼Object.prototype.extend=……,就是給Object增加了一個實(shí)例方法extend,實(shí)例方法中就可以引用this指針,指向由這個類實(shí)例化的對象本身。當(dāng)然,這個對象就具有成員extend。
繼續(xù)之前,先了解一下兩個語句:
for(var p in object){}
method.apply(object,arguments);
第一句:列舉出一個變量的所有成員,如果是函數(shù),那么是所有靜態(tài)成員;如果是對象,那就是所有實(shí)例成員,p的類型是一個字符串。表示成員的名稱。引用一個成員不僅可以用variabel.member,還可以用variabel["member"]。反過來,賦值也是如此。這就給枚舉一個變量的成員帶來了很大方便。