找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2134|回复: 2

[教程] Javascript中定义方法的另类写法(批量定义Javascript对象的方法)

[复制链接]
发表于 2013-3-25 09:50:38 | 显示全部楼层 |阅读模式 来自 中国–广东–湛江
用了很多的Javascript框架,偶尔也会去看一下框架的源码,经常会看到这样的代码:
  
  1. isArray : function(v){
  2.               return toString.apply(v) === '[object Array]';
  3.         },
  4.         
  5.         isDate : function(v){
  6.             return toString.apply(v) === '[object Date]';
  7.         },
  8.         
  9.         isObject : function(v){
  10.             return !!v && Object.prototype.toString.call(v) === '[object Object]';
  11.         },

  12.         
  13.         isPrimitive : function(v){
  14.             return Ext.isString(v) || Ext.isNumber(v) || Ext.isBoolean(v);
  15.         },
  16.         
  17.         isFunction : function(v){
  18.             return toString.apply(v) === '[object Function]';
  19.         },
  20.         
  21.         isNumber : function(v){
  22.             return typeof v === 'number' && isFinite(v);
  23.         },
  24.         
  25.         isString : function(v){
  26.             return typeof v === 'string';
  27.         },
  28.         
  29.         isBoolean : function(v){
  30.             return typeof v === 'boolean';
  31.         }
复制代码

  上面是Extjs3.X ext-base.js里面的判断类型的代码,你仔细一看, 会发现有很多相同的东西, 如:
  
is类型:function(v){
   return toString.apply(v) ==="类型";
}

或者
is类型:function(v){
   
returntypeof v ==="类型";
}

然而里面的tyoeof 我们可以统一使用 toString方法来判断类型,所有上面的代码可以是同一个类型,即:
  var is类型=function(v){
     return  toString.call(v) ==="类型";
}

  上面的就是一个模型,对应这个判断的方法体内是一个的方法, 我们可以对他进行简化(但是有个弊端:可读性差),可以大大减少代码,从而可以提高Javascript加载效率,改进后的代码如下:
  1. var Easy={}, dataTypes = ["Number", "Boolean", "String", "Array",
  2.                     "Object", "Function", "Date", "RegExp"];
  3. var toStr = Object.prototype.toString;
  4.     var is = function (v, t) {
  5.         return toStr(o) == "[object " + t + "";
  6.     };
  7.     for (var i = 0, len = dataTypes.length, t; i < len; i++) {
  8.         (function (t) {
  9.             Easy["is" + t] = function (o) {
  10.                 return is(o, t);
  11.             }
  12.         })(dataTypes);//用到了闭包
  13.     }

复制代码
    上面这段代码, 我们就为Easy这个对象创建了8个is开头的判断类型的方法;当然如果有些方法不合理还可以覆盖如:
  1. Easy.isNumber=function(v){   
  2.   return toString.call(v) ==="[object Number]"&& isFinite(v);
  3. }
复制代码

发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;

如何回报帮助你解决问题的坛友,好办法就是点击帖子下方的评分按钮给对方加【金币】不会扣除自己的积分,做一个热心并受欢迎的人!

发表于 2013-3-25 11:04:43 | 显示全部楼层 来自 中国–北京–北京
这个不错,学习了

点评

互相学习,互相学习  详情 回复 发表于 2013-3-25 11:51

评分

参与人数 1金币 +5 收起 理由
抢楼评分专号 + 5 很幸运,你获得了抢楼奖励!

查看全部评分

发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;

如何回报帮助你解决问题的坛友,好办法就是点击帖子下方的评分按钮给对方加【金币】不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-3-25 11:51:43 | 显示全部楼层 来自 中国–广东–湛江
猫性男孩 发表于 2013-3-25 11:04
这个不错,学习了

互相学习,互相学习

发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;

如何回报帮助你解决问题的坛友,好办法就是点击帖子下方的评分按钮给对方加【金币】不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 需要先绑定手机号

关闭

站长推荐上一条 /1 下一条

QQ|侵权投诉|广告报价|手机版|小黑屋|西部数码代理|飘仙建站论坛 ( 豫ICP备2022021143号-1 )

GMT+8, 2024-12-23 04:55 , Processed in 0.067784 second(s), 13 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表