承接上篇 本篇将分装保护函数
直接上代码
!(function (){
//1.第一步 先备份一份tostring方法
const $toString=Function.prototype.toString
const symbol=Symbol()
//.3.改写函数
const mytoString=function (){
//首先先判断 调用这个tostring 方法是不是一个 函数 如果是一个函数 那么就返回 这个函数的 symbol属性 如果没有symbol 属性 ,那么就调用原生 保存的$toString方法
return typeof this ==="function" && this[symbol] || $toString.call(this)
}
set_native=function (func,key,val){
Object.defineProperty(func,key,{
enumerable:false,
configurable:true,
writable:true,
value:val
})
}
//2.第二部然后再将该方法删除 //把他删除以后就要进行对他改写 对方法的改写
delete Function.prototype.toString;
//4. 我们已经改写了tostring方法 但是我们没有在原型链上添加该属性
set_native(Function.prototype,"toString",mytoString)
set_native(Function.prototype.toString,"toString","function toString() { [native code] }")
globalThis.set_Native=function (func,funcname){//方法的总入口
set_native(func,symbol,`function ${funcname || func.name || ""}() { [native code] }`)
}
})()
add=function (a,b){
return a+b
}
set_Native(add,"add")
console.log(add.toString())
console.log(Function.prototype.toString.call(add))
//运行结果function add() { [native code] }
//function add() { [native code] }