+ -
当前位置:首页 → 问答吧 → 品味prototype1.6 新加入方法

品味prototype1.6 新加入方法

时间:2007-11-13

来源:互联网

prototype在很多模块上加了很好用的方法,本次仅针对Function中一些地方共同品味一下
回味一下bind方法
当初刚接触prototype时最疑惑的地方是Function中bind方法
复制内容到剪贴板
代码:
Function.prototype.bind = function() {
   var __method = this;//获得当前方法的引用 (run.bind(this); 就是run)
   var args = $A(arguments);
   //获得传递给bind方法的参数 并转化为数组
   //应用run.bind(this,1,2,3) args就是[(this对象的引用),1,2,3]
   var object = args.shift();
   //就是把(this对象的引用)提取出来
  return function() {
    return __method.apply(object, args.concat($A(arguments)));
    //这里的arguments又是另外一个了
    //比如 var kk = run.bind(this,1,2,3);
   // kk(4,5);这里的arguments就是[4,5]
  }
}
但这个方法实在很实用
对于初学者,我教你这样理解
复制内容到剪贴板
代码:
function run(){
  if(this.timer){
    alert('获得了this对象');
    return;
  }
  this.timer  = setTimeout(run.bind(this),1000);
  //问题: run你不加bind(this)的话会怎么样
  //1秒后由setTimeout调用的这个函数,如果不bind(this)的话 函数中this这个对像会丢失
  // 也就永远不会alert('获得了this对象'); 而且进入每隔1秒重复调用run()死循环
  // run.bind(this)() = run.apply(this)
}
mootools中也有 不过mootools有点变态(仅个人观点,不代表phpchina观点),多加了个create方法,有点画蛇添足之嫌,代码就不贴了

新方法
  • 延时执行
复制内容到剪贴板
代码:

Function.prototype.delay=function() {
    var __method = this, args = $A(arguments), timeout = args.shift() * 1000;
    return window.setTimeout(function() {
      return __method.apply(__method, args);
    }, timeout);
  }
上面bind的介绍看懂了的话,这个就很轻松能看懂,不知道他是不是抄袭mootools的 mootools中可是先有这个方法的
mootools的还可以绑定一个闭包(对象),而他仅是普通function的延时执行,如果那个function里面如果含有this的话,将得不到引用
复制内容到剪贴板
代码:

var obj = function(){
    this.kk = '你得到我了';
    (function(){
       alert(this.kk)// prototype 中会空值
    }).delay(1,1,2,3);//延时一秒执行,传递参数1,2,3
}
new obj();
  • methodize方法
汉语解释是使某个方法有条理
复制内容到剪贴板
代码:

  Function.prototype.methodize=function() {
    if (this._methodized) return this._methodized;
    var __method = this;
    return this._methodized = function() {
      return __method.apply(null, [this].concat($A(arguments)));
    };
  }
代码意思是把对象作为参数合并到其参数中,不知道在哪有用途
先理解、消化了再说
复制内容到剪贴板
代码:

var obj = function(){
   var kk = (function(){
       alert(arguments[0]);// IE中打印object
       alert(arguments[1]);// 这才打印第一个参数
   }).methodize();//methodize方法不接受参数
   kk('第一个参数',2,3);
}
new obj();
  • argumentNames方法
顾名思义获得参数名称列表
复制内容到剪贴板
代码:
Function.prototype.argumentNames=function() {
    var names = this.toString().match(/^[\s\(]*function[^(]*\((.*?)\)/)[1].split(",").invoke("strip");
    return names.length == 1 && !names[0] ? [] : names;
};
主要是用toString方法获得函数代码,利用正则或得参数列表

还有curry,wrap方法以后再续

不支持偶的观点望批评指正

[ 本帖最后由 muqiao 于 2007-11-13 03:21 编辑 ]

作者: muqiao   发布时间: 2007-11-13

  不错,吸收一下。

作者: 特蓝克斯   发布时间: 2007-11-13

很少人看我的帖啊
这里改变下对delay方法的看法
今天对mootools很多东西感到恶心,还是prototype的delay最实际
mootools delay方法有个bind参数
造成每个方法都要用call/apply方法调用 不知道call/apply效率到底有多高
先不谈效率
假如用户函数没有必要bind,那也得bind,搞得call/apply很受重视
真的bind时  prototype可以先将函数bind 再delay
我感觉这样更好

作者: muqiao   发布时间: 2007-11-14

支持下

作者: 天使的魔鬼   发布时间: 2007-11-14

支持下!

作者: luzhou   发布时间: 2007-11-14

不错,对于prototype的认识,我也是觉得这个地方很奇妙. ,主要是apply的灵活运用+this的深刻理解.

作者: chemila65   发布时间: 2008-02-12

对JS很陌生,但prototype 从 1.3.1就开始关注。

作者: smallwl   发布时间: 2008-02-13

热门下载

更多