【repost】JS中的hook机制
hook机制也就是钩子机制,由表驱动实现,常用来处理多种特殊情况的处理。我们预定义了一些钩子,在常用的代码逻辑中去适配一些特殊的事件,这样可以让我们少些很多if else语句。
举个高考加分的例子,比如获得过全国一等奖加20分,二等奖加10分,三等奖加5分。使用if else的话:
function student(name,score,praise){
return {
name:name,
score:score,
praise:praise
}
}
function praiseAdd(students){
var results={};
for (var i in students){
var curStudent=students[i];
var ret=curStudent.score;
if(curStudent.praise==1){
ret+=20;
}else if(curStudent.praise==2){
ret+=10;
}else if(curStudent.praise==3){
ret+=5;
}
results[curStudent.name]=ret;
}
return results;
}
var liming= student("liming",70,1);
var liyi= student("liyi",90,2);
var liuwei= student("liuwei",80,3);
var ertuzi= student("ertuzi",85,3);
var result=praiseAdd([liming,liyi,liuwei,ertuzi]);
for(var i in result){
console.log("name:"+i+",score:"+result[i]);
}
如果是用钩子机制呢
function student(name,score,praise){
return {
name:name,
score:score,
praise:praise
}
}
var praiseList={
1:20,
2:10,
3:5
}
function praiseAdd(students){
var results={};
for (var i in students){
var curStudent=students[i];
var ret=curStudent.score;
if(praiseList[curStudent.praise])
ret+=praiseList[curStudent.praise];
results[curStudent.name] = ret;
}
return results;
}
var liming= student("liming",70,1);
var liyi= student("liyi",90,2);
var liuwei= student("liuwei",80,3);
var ertuzi= student("ertuzi",85,3);
var result=praiseAdd([liming,liyi,liuwei,ertuzi]);
for(var i in result){
console.log("name:"+i+",score:"+result[i]);
}
所以简单的说,其实钩子机制就是利用一张表去匹配,而不是一次次的if条件判断。
jQuery中大量的使用了钩子机制去做一些兼容。拿$.type方法为例:
(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);
core_toString是定义了一个空对象,然后保存toString()方法。
var core={};
var core_toString=core.toString;
这样后边就可以直接调用Object.prototype.toString()方法,而不用每次都再去原型链上去找,节约了很多开销,jQuery中做了很多这样的变量保存。
另外typeof new Number(1) //= "object"这好像不科学啊——但是new出来的就是一个对象啊,显然是我们的使用方式存在一些问题。应该是按如下方法使用:
Object.prototype.toString.call(new Number(1)) //= "[object Number]"
在这儿需要区别下两个概念:对象实例和字面值。
js中有5个基本数据类型:字符串、数值、布尔类型、null和undefined。只有字符串、数值和布尔数据类型有对应的构造方法对象。字符串、浮点数、整数和布尔值都是字面值。
我们可以使用严格相等性来比较一个对象实例和一个字面值
var str1 = String("string");
var num1 = Number(1.23);
var bool1 = Boolean(true);
if (str1 === "string") {
console.log("equal");
}
if (num1 === 1.23) {
console.log('equal');
}
if (bool1 === true) {
console.log('equal');
}
var str2 = new String("string");
var num2 = new Number(1.23);
var bool2 = new Boolean(true);
if (str2 === "string") {
console.log('equal');
} else {
console.log('not equal');
}
if (num2 === 1.23) {
console.log('equal');
} else {
console.log('not equal');
}
if (bool2 === true) {
console.log('equal');
} else {
console.log('not equal');
}
//打印结果
equal
equal
equal
not equal
not equal
not equal
也就是基本类型变量(没有使用new创建的变量)严格的等于字面值,而对象实例则不会。
对于Object.prototype.toString方法更详细的介绍,可以参考这篇博客
除了做一些兼容或者定值的匹配,钩子机制在项目中能否使用呢?那我就做一个代码的搬运工,这是12年的一篇文章,介绍钩子机制在项目中的使用的 ,虽然这几年面向对象的写法在不断的丰富,不过,或许在某些方面我们仍能得到一点借鉴吧。
【repost】JS中的hook机制的更多相关文章
- 别再为了this发愁了------JS中的this机制
别再为了this发愁了------JS中的this机制 题记:JavaScript中有很多令人困惑的地方,或者叫做机制.但是,就是这些东西让JavaScript显得那么美好而与众不同.比方说函数也是对 ...
- 再次讲解js中的回收机制是怎么一回事。
在前几天的一篇闭包文章中我们简单的介绍了一下闭包,但是并没有深入的讲解,因为闭包涉及的知识点比较多,为了能够更好的理解闭包,今天讲解一下关于js中的回收机制. 在初识闭包一文中我说过js中有回收机制这 ...
- 关于js中的回收机制,通俗版
在前面的几篇文章中,我讲解过了js中的回收机制,但是对于当时的我来说,我自己对回收机制的这个概念也有些懵懵懂懂,现在对回收机制有了更深入的理解,所以特此发布此文给于总结,也好加深记忆. 如果你想学习闭 ...
- 次讲解js中的回收机制是怎么一回事。
在前几天的一篇闭包文章中我们简单的介绍了一下闭包,但是并没有深入的讲解,因为闭包涉及的知识点比较多,为了能够更好的理解闭包,今天讲解一下关于js中的回收机制. 在初识闭包一文中我说过js中有回收机制这 ...
- Nova中的Hook机制
Nova的代码中支持Hook机制,也就是在某些函数的前后,可以加入自己的代码逻辑.Hook代码可以完全独立于Nova开发,本质上使用setuptools的entry points机制.K版本的Open ...
- [转] js中的钩子机制(hook)
什么是钩子机制?使用钩子机制有什么好处? 钩子机制也叫hook机制,或者你可以把它理解成一种匹配机制,就是我们在代码中设置一些钩子,然后程序执行时自动去匹配这些钩子:这样做的好处就是提高了程序的执行效 ...
- 别再为了this发愁了:JS中的this机制
题记:JavaScript中有很多令人困惑的地方,或者叫做机制.但是,就是这些东西让JavaScript显得那么美好而与众不同.比方说函数也是对象.闭包.原型链继承等等,而这其中就包括颇让人费解的th ...
- JS中的this机制
1.this是啥? 简言之,this是JavaScript语言中定义的众多关键字之一,它的特殊在于它自动定义于每一个函数域内,但是this倒地指引啥东西却让很多人张二摸不着头脑.这里我们留个小悬念,希 ...
- JS中的存储机制
一.堆和栈的介绍 1.堆和队,是先进先出:栈,是先进后出,就跟水桶差不多: 2.存储速度:堆和队的存储速度较慢,栈的存储速度较快,会自动释放: 二.js中存储的类型 1.堆,一般用于复杂数据类型,存储 ...
随机推荐
- libmysql.dll 找不到
在用C#开发的时候,需要连接MySQL ,系统提示 libmysql.dll 找不到模块. 我们可以找到 MySQL安装文件夹下的 C:\Program Files\MySQL\MySQL Ser ...
- 安卓开发-使用XML菜单布局简单介绍
使用xml布局菜单 目前为止我们都是通过硬编码来增加菜单项的,android为此提供了一种更便利的方式,就是把menu也定义为应用程序的资源,通过android对资源的本地支持,使我们可以更方便地 ...
- linux 查看进程 和 杀死进程
ps ax 显示当前系统进程的列表 PID TTY STAT TIME COMMAND ps aux 显示当前系统进程详细列表以及进程用户 USER PID %CPU %ME ...
- Lucene中的 Query对象
"Lucene中的 Query对象": 检 索前,需要对检索字符串进行分析,这是由queryparser来完成的.为了保证查询的正确性,最好用创建索引文件时同样的分析器. quer ...
- linux下执行scrapy的爬虫定时任务
刚开始执行scrapy crawl zentaos可以完成扫描 但是通过linux的crontab任务,只执行了连接mongodb的操作,并创建了索引 也就是说scrapy crawl zentaos ...
- aspx基础开始
<%@ Page Language="C#" Debug="true" trace="false" validateRequest=& ...
- leveldb性能分析
Leveldb是一个google实现的非常高效的kv数据库,目前的版本1.2能够支持billion级别的数据量了. 在这个数量级别下还有着非常高的性能,主要归功于它的良好的设计.特别是LSM算法. 那 ...
- Android Screen Monitor使用
Android Screen Monitor的使用 用来把android手机屏幕投射到电脑屏幕上,能够放大缩小屏幕,与手机屏幕保持同步. 这个项目是一个开源项目,源码地址:https://code.g ...
- 利用线程把文本文件填充到richTextBox;防止导入大文本文件窗口假死现象
private void btnDr_Click(object sender, EventArgs e) { richTextBox1.Text = ""; //richTextB ...
- 2016大连网络赛 Different GCD Subarray Query
Different GCD Subarray Query Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K ( ...