1.手动实现call、apply、bind

Function.prototype.mycall = function(obj){
         var args = Array.prototype.slice.apply(arguments,[1]);
         obj.fn = this;
         obj.fn(...args);//es6的解构语法,也可以使用obj.fn.apply(obj,args);
         delete  obj.fn;
}

eval() 函数会将传入的字符串当做 JavaScript 代码进行执行。

 

apply

Function.prototype.myapply = function(obj,arr){
        obj.fn = this;
         if(!arr){
             obj.fn();
        }else{
             var args = []; 
       for(var i = 0; i < arr.length; i++) {
             args.push('arr[' + i + ']');
         }
         
         eval('obj.fn('+args+')');
 }
       
         delete  obj.fn;
 
}

bind

//简洁版的new操作符实现过程
 
function newFunc(constructor){
      //第一步:创建一个空对象obj 
        var obj = {};
       //第二步:将构造函数 constructor的原型对象赋给obj的原型
        obj.__proto__ = constructor.prototype;
      //第三步:将构造函数 constructor中的this指向obj,并立即执行构造函数内部的操作
        constructor.apply(obj);
      //第四步:返回这个对象
        return obj;
}

 

posted @ 2023-03-05 10:06  不想做混子的奋斗远  阅读(38)  评论(0)    收藏  举报