先看看jq的hook表驅(qū)動(dòng)的實(shí)現(xiàn):
(function(window, undefined) {
var
// 用于預(yù)存儲(chǔ)一張類型表用于 hook
class2type = {};
// 原生的 typeof 方法并不能區(qū)分出一個(gè)變量它是 Array 普舆、RegExp 等 object 類型殖侵,jQuery 為了擴(kuò)展 typeof 的表達(dá)力炮姨,因此有了 $.type 方法
// 針對(duì)一些特殊的對(duì)象(例如 null射沟,Array,RegExp)也進(jìn)行精準(zhǔn)的類型判斷
// 運(yùn)用了鉤子機(jī)制太雨,判斷類型前,將常見類型打表魁蒜,先存于一個(gè) Hash 表 class2type 里邊
jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
class2type["[object " + name + "]"] = name.toLowerCase();
});
jQuery.extend({
// 確定JavaScript 對(duì)象的類型
// 這個(gè)方法的關(guān)鍵之處在于 class2type[core_toString.call(obj)]
// 可以使得 typeof obj 為 "object" 類型的得到更進(jìn)一步的精確判斷
type: function(obj) {
if (obj == null) {
return String(obj);
}
// 利用事先存好的 hash 表 class2type 作精準(zhǔn)判斷
// 這里因?yàn)?hook 的存在囊扳,省去了大量的 else if 判斷
return typeof obj === "object" || typeof obj === "function" ?
class2type[core_toString.call(obj)] || "object" :
typeof obj;
}
})
})(window);
代碼轉(zhuǎn)載于ChokCoco
某種程度上講,鉤子是一系列被設(shè)計(jì)為以你自己的代碼來處理自定義值的回調(diào)函數(shù)兜看。