The JavaScript Prototype Property
JavaScript沒(méi)有提供傳統(tǒng)的類結(jié)構(gòu),使你可以通過(guò)繼承它,然后加入新功能來(lái)擴(kuò)展一個(gè)類。相反,這門(mén)語(yǔ)言使用prototype屬性來(lái)擴(kuò)展現(xiàn)有對(duì)象,以及它們的示例。
prototype是在運(yùn)行期定義的一個(gè)屬性和方法的集合,它對(duì)對(duì)象的每個(gè)示例都是有效的,而且不管這些示例是在prototype修改前,還是修改后建立的。
prototype在JavaScript中的工作原理是:當(dāng)訪問(wèn)對(duì)象的屬性時(shí),瀏覽器的腳本引擎首先會(huì)從本地屬性(native propertie)中查找這個(gè)屬性,接著會(huì)在prototype屬性中進(jìn)行查找。如果在prototype屬性中沒(méi)有找到,它就會(huì)檢查示例級(jí)的屬性。
在如下的代碼中,我們使用prototype屬性,來(lái)擴(kuò)展Number對(duì)象,在這里,我們添加了一個(gè)新的屬性percentage,以及一個(gè)新的方法adjustValue:
Number.prototype.percentage = 0.15; // 15%
Number.prototype.adjustValue = function()
{
return this * this.percentage;
}
我們可以像訪問(wèn)本地屬性一樣訪問(wèn)新屬性:
var someValue = 3.0;
alert(someValue.adjustValue());
這個(gè)應(yīng)用程序會(huì)顯示一個(gè)消息,這個(gè)消息會(huì)把調(diào)整后的值顯示出來(lái),也就是將初始值3.0乘以0.15。
Prototype庫(kù)利用prototype的能力,為某些內(nèi)置對(duì)象添加擴(kuò)展,例如:String、Array、Function。下面就是一個(gè)對(duì)stripTags方法進(jìn)行擴(kuò)展的示例,它可以剔除字符串中所有元素的標(biāo)簽。
var str = "<p>This is a paragraph</p>";
var newStr = str.stripTags(); // 結(jié)果是“This is a paragraph”
JavaScript的prototype屬性的功能相當(dāng)強(qiáng)大,而且在很大程度上構(gòu)成了Prototype庫(kù)的基礎(chǔ)。但同時(shí)它也是有風(fēng)險(xiǎn)的。