js小白模拟系列:模拟bind

这个比call和apply 要稍微复杂点,多层函数的嵌套
版本1.0 没解决原型链

Function.prototype.myBind = function (context) {
      var context = context || window;
        var args = [].slice.call(arguments,1);//第一位是 context 其余的要传给fn
        var fn = this;
        return function () {
            var _args = [].slice.call(arguments);
            return fn.apply(context,args.concat(_args));
        }
     }
     
       var name = 'window';
       var obj = {name : 'obj'}
       function test (a,b,c,d) {
        console.log(this.name);
        console.log(a,b,c,d);
       }
       
       var newTest = test.myBind(obj,'a');
       newTest('b','c','d');

版本2.0 解决原型链继承.

 Function.prototype.myBind = function (context) {
      var context = context || window;
        var args = [].slice.call(arguments,1);//第一位是 context 其余的要传给fn
        var fn = this;
        function temp () {};
        temp.prototype = fn.prototype;
        F.prototype = new temp();
        function F () {
            var _args = [].slice.call(arguments);
            return fn.apply(this instanceof temp ? this : context,args.concat(_args));
        }
//这里涉及两个知识点,一个是继承,这里用的是圣杯模式
//一个是new  . 没有new this指向 window , 如果new this指向 F 构造出来的实例.
        return F
     }
     
       var name = 'window';
       var obj = {name : 'obj'}
       
       test.prototype.age = 18;
       function test (a,b,c,d) {
        this.name = 'mike';
        console.log(this.name);
        console.log(a,b,c,d);
       }
       
       var newTest = test.myBind(obj,'a');
       var obj = new newTest('b','c','d');//mike,a,b,c,d
       console.log(name);// window
       console.log(obj.age);//18
       console.log(obj.name);//mike
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前几天,有个大一女生在微信中问我:你觉得大学生是不是最好不要谈恋爱? 我说,随缘吧,要谈也要谈有意义的恋爱。 然后...
    微语东来阅读 460评论 0 2
  • 起床:5:31 体重: kg 反思: 1、昨日青蛙全部完成:晨间反思日记、陪含月高中报到、学院值班,预科...
    水墨0801阅读 117评论 0 0
  • 2016-02-28 git --versiongit config --global user.name ***...
    沈宇阅读 228评论 0 1

友情链接更多精彩内容