zoukankan      html  css  js  c++  java
  • js学习-apply,call,bind的实现

    目录

    apply

    简单说:构建一个和调用aplly函数一样的字符串,用eval执行,完了之后删除掉,最后返回执行的结果。

    Function.prototype.applyCopy = function() {
      var obj = arguments[0];
      obj.fn = this;
      var args = arguments[1];
    
      if(!args || args.length == 0) return obj.fn();
    
      // obj.fn参数
      var argsStr = '';
    
      for(var i in args) {
        argsStr += '"' + arguments[1][i] + '",';
      }
    
      var result = eval('obj.fn('+argsStr.replace(/,$/, '')+')');
      
      delete obj.fn;
      return result;
    };  
    

    call

    Function.prototype.callCopy = function() {
      var obj = [].shift.applyCopy(arguments);
      return this.applyCopy(obj, arguments);
    }
    

    bind

    Function.prototype.bindCopy = function() {
      var _this = this;
      var obj = arguments[0];
      return function() {
        return _this.applyCopy(obj, arguments);
      }
    }
    

    demo

    var s = {
      desc: 's.desc',
      name: '你好',
    }
    
    var name = 'window';
    var desc = 'window => this'
    
    function sayHi(age, type) {
      return {
        name: this.name,
        desc: this.desc,
        age: age,
        type: type
      }
    }
    
    console.log(sayHi(12,'sayHi'));
    console.log(sayHi.applyCopy(s, [12, 'applyCopy']));
    console.log(sayHi.callCopy(s, 12, 'callCopy'));
    console.log(sayHi.bindCopy(s)(12, 'bindCopy'));
    

    总结:apply是基础,call,bind都是在apply的基础上实现的。

  • 相关阅读:
    构建之法阅读笔记05
    构建之法阅读笔记04
    构建之法阅读笔记03
    学习进度条
    软件工程练习——买书
    软件工程练习——找水王2
    Java作业07
    Java课堂作业06
    读《大道至简》第六章有感
    Java课堂作业05
  • 原文地址:https://www.cnblogs.com/meetqy/p/11848475.html
Copyright © 2011-2022 走看看