先看看jq的hook表驅動的實現:
(function(window, undefined) {
var
// 用于預存儲一張類型表用于 hook
class2type = {};
// 原生的 typeof 方法并不能區分出一個變量它是 Array 、RegExp 等 object 類型,jQuery 為了擴展 typeof 的表達力,因此有了 $.type 方法
// 針對一些特殊的對象(例如 null,Array,RegExp)也進行精準的類型判斷
// 運用了鉤子機制,判斷類型前,將常見類型打表,先存于一個 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 對象的類型
// 這個方法的關鍵之處在于 class2type[core_toString.call(obj)]
// 可以使得 typeof obj 為 "object" 類型的得到更進一步的精確判斷
type: function(obj) {
if (obj == null) {
return String(obj);
}
// 利用事先存好的 hash 表 class2type 作精準判斷
// 這里因為 hook 的存在,省去了大量的 else if 判斷
return typeof obj === "object" || typeof obj === "function" ?
class2type[core_toString.call(obj)] || "object" :
typeof obj;
}
})
})(window);
代碼轉載于ChokCoco
某種程度上講,鉤子是一系列被設計為以你自己的代碼來處理自定義值的回調函數。