手寫代碼call,apply,bind,new,constructor,instanceof hasPubProperty

call

//call()讓函數執行,第一個參數讓this的指向改成傳進去的參數 後面的當參數傳進函數裏面。返回值爲原函數的返回值 若是不傳參數爲window
Function.prototype.myCall=function myCall(context=window,...arg){
      
     let m=Symbol();
     context[m]=this;
     let res=context[m](...arg);
     delete context[m]//若是不刪除,Function的原型上會有一個方法。
     return res;
}

複製代碼

apply

//apply()讓函數執行,第一個參數讓函數內部的this的指向改成傳進去的參數,第二個參數爲數組,返回值爲原函數的返回值,若是不傳參數。默認爲window 和[];
  Function.prototype.myApply=function myApply(context=window,...arg=[]){
      let m=Symbol();
      context[m]=this;
      let res=context[m](arg);
      delete context[m];
      return res;
      
  }

複製代碼

bind

//bind()不讓函數執行,第一個參數讓函數內部的this的指向改成傳進去的參數,第二個做爲參數傳進原函數中,返回一個新的函數,而且新的函數能夠從新傳值,加上上面第二個參數一塊兒傳入新函數中。
  Function.prototype.myBind=function myBind(context=window,...arg)
    return (...ary)=>{
        return this.apply(context,arg.concat(ary));
    }

複製代碼

new

//new 函數執行,形參賦值,變量提高,生成一個堆內存 this指向這個堆內存
 代碼從上到下執行  返回這個堆內存;
 function myNew(...arg){
     var obj={};
     var Constructor=arg.shift();
     obj.__proto__=Constructor.prototype;
     var res=Constructor.apply(obj,arg);
      return typeof res==="object"?res:obj
     return 
 }

複製代碼

constructor

// 檢測數據類型 是什麼返回數據類型
 function type(temp){
    let str= temp.constructor.toString();
    return str.slice(9,str.indexOf("("));
 }


複製代碼

instanceof

//instanceOf xxx instanceof xxx2  xxx 到基類原型上 有沒有xxx2的原型
   function myInstance_Of(L,R){
   var r=R.prototype,
       l=L.__proto__
     while(true){
         if(L===null)return false;
         if(l===r) return true;
         l=L.__proto_;
     }
   }

複製代碼

hasPubProperty

return temp in this && !this.hasOwnProperty(temp);
    
}



複製代碼
相關文章
相關標籤/搜索