讀古今文學網 > 編寫高質量代碼:改善JavaScript程序的188個建議 > 建議64:建議通過Function擴展類型 >

建議64:建議通過Function擴展類型

JavaScript允許為語言的基本數據類型定義方法。通過為Object.prototype添加原型方法,該方法可被所有的對象使用。這樣的方式對函數、數組、字符串、數字、正則表達式和布爾值都適用。例如,通過給Function.prototype增加方法,使該方法對所有函數可用。


Function.prototype.method=function(name,func){

this.prototype[name]=func;

return this;

};


為Function.prototype增加一個method方法後,就不必使用prototype這個屬性了,然後調用method方法直接為各種基本類型添加方法。

JavaScript並沒有單獨的整數類型,因此有時候只提取數字中的整數部分是必要的。JavaScript本身提供的取整方法有些不太好,下面通過為Number.prototype添加一個integer方法來改善它。


Number.method('integer',function{

return Math[this<0?'ceil':'floor'](this);

});

document.writeln((-10/3).integer);//-3


Number.method方法能夠根據數字的正負來判斷是使用Math.ceiling還是Math.floors,這樣就避免了每次都編寫上面的代碼。


String.method('trim',function{

return this.replace(/^\s+|\s+$/g,'');

});

document.writeln('"'+"abc".trim+'"');//'abc''


trim方法使用了一個正則表達式,把字符串中左右兩側的空格符清除掉。

通過為基本類型擴展方法,可以大大提高語言的表現力。由於JavaScript原型繼承的本質,因此,所有原型方法立刻被賦予到所有的實例,即使該實例在原型方法創建之前就創建好了。

注意:基本類型的原型是公共結構,在擴展基類時務必小心,避免覆蓋掉基類的原生方法。一個穩妥的做法就是在確定沒有該方法時才添加它。


Function.prototype.method=function(name,func){

if(!this.prototype[name]){

this.prototype[name]=func;

return this;

}

};


另外,for in語句用在原型上時表現很糟糕。可以使用hasOwnProperty方法篩選出繼承而來的屬性,或者查找特定的類型。