国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 語(yǔ)言 > JavaScript > 正文

javascript當(dāng)中的代碼嗅探擴(kuò)展原生對(duì)象和原型(prototype)

2024-05-06 14:20:03
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

注:翻譯之中有什么不恰當(dāng)?shù)牡胤剑瑲g迎大家指正,祝大家雙節(jié)快樂(lè)!
如果不是有特殊需要而去擴(kuò)展原生對(duì)象和原型(prototype)的做法是不好的
代碼如下:
//不要這樣做
Array.prototype.map = function() {
// 一些代碼
};

除非這樣做是值得的,例如,向一些舊的瀏覽器中添加一些ECMAScript5中的方法。
在這種情況下,我們一般這樣做:
代碼如下:
if (!Array.prototype.map) {
Array.prototype.map = function() {
//一些代碼
};
}

如果我們比較偏執(zhí),為了防止別人將map定義為其它意想不到的值,像true或其他,我們可以 將檢測(cè)代碼改為下面這樣:
代碼如下:
if (typeof Array.prototype.map !== "function") {
Array.prototype.map = function() {
// 一些代碼
};
}

(盡管這將破壞其它開(kāi)發(fā)者的map定義,并影響他們功能的實(shí)現(xiàn))
但是,在一個(gè)充滿敵意和殘酷競(jìng)爭(zhēng)的環(huán)境下(換句話說(shuō),但你提供或者使用一個(gè)js庫(kù)時(shí)),你不應(yīng)該相信任何人。如果其他人的js代碼先于你的js代碼加載,并且以某種方式定義了一個(gè)不完全兼容ES5的map()方法,導(dǎo)致你的代碼不能正常運(yùn)行,該怎么辦呢?

不過(guò),你可以相信瀏覽器,如果Webkit內(nèi)核實(shí)現(xiàn)了map()方法,你可以放心,這個(gè)方法肯定會(huì)正常運(yùn)行。否則的話,你就要用你的代碼進(jìn)行檢測(cè)了。

幸運(yùn)的是,這在JavaScript當(dāng)中很容易實(shí)現(xiàn),當(dāng)你調(diào)用原生函數(shù)的toString方法的時(shí)候,會(huì)返回一個(gè)函數(shù)的字符串,該函數(shù)的函數(shù)體是[native code]。
例如在Chrome的控制臺(tái)下:
代碼如下:
> Array.prototype.map.toString();
"function map() { [native code] }"

一個(gè)適當(dāng)?shù)拇a檢查向來(lái)就是一個(gè)稍微令人不快的事,因?yàn)椴煌瑸g覽器對(duì)空格和換行處理的太過(guò)輕率。測(cè)試如下:
代碼如下:
Array.prototype.map.toString().replace(//s/g, '*');
// "*function*map()*{*****[native*code]*}*" // IE
// "function*map()*{*****[native*code]*}" // FF
// "function*map()*{*[native*code]*}" // Chrome

只簡(jiǎn)單的去掉/s會(huì)得到更實(shí)用的字符串:
代碼如下:
Array.prototype.map.toString().replace(//s/g, '');
// "functionmap(){[nativecode]}"

你可以將它封裝成一個(gè)可以重用的shim()函數(shù),這樣以來(lái)你就沒(méi)有必要去重復(fù)所有的類(lèi)似!

Array.prototype...這樣的操作了。這個(gè)函數(shù)會(huì)接受一個(gè)對(duì)象作為參數(shù)(例如,Array.prototype),一個(gè)將要添加的屬性(例如 'map')和一個(gè)要添加的函數(shù)。
代碼如下:
function shim(o, prop, fn) {
var nbody = "function" + prop + "(){[nativecode]}";
if (o.hasOwnProperty(prop) &&
o[prop].toString().replace(//s/g, '') === nbody) {
//表名是原生的!
return true;
}
//新添加的
o[prop] = fn;
}

測(cè)試:
代碼如下:

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 桑植县| 金寨县| 清水河县| 宣化县| 阜阳市| 陆丰市| 遂溪县| 准格尔旗| 张家界市| 伊宁县| 奇台县| 黄龙县| 同江市| 承德县| 孝义市| 金山区| 贡嘎县| 浦江县| 六枝特区| 马鞍山市| 蓝田县| 安义县| 楚雄市| 镇坪县| 宁河县| 汾阳市| 沙河市| 绥芬河市| 钟祥市| 枣庄市| 洮南市| 绍兴县| 文安县| 中江县| 三门县| 来宾市| 天水市| 巴彦淖尔市| 嵩明县| 修武县| 汝城县|