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);
}
複製代碼