Js函数native化
大家都知道Js函数在正常情况下可以用toString()方法打印出来,以本博客为例演示(https://bk.yyge.net)
如上图所示 我们在控制台输入window.get_menu_nav_open.toString()
获取全局对象下的get_menu_nav_open函数,并且利用toString()将其转换为字符串
针对这种直接明文获取的情况对开发者来说非常不友好,那么我们应该如何应对这种问题呢
我们不想让函数明文打印应该怎么做呢?
将函数native化就可以实现我们想要的效果 。我们之间看看最终的保护效果吧
那么这是如何做到的呢?我直接将函数贴出来大家可以参考学习
//函数native化
!function (){
const $toString = Function.prototype.toString;
const symbol=Symbol();
const myToString = function (){
return typeof this === 'function' && this[symbol] || $toString.call(this);
};
function set_native(func, key, value){
Object.defineProperty(func,key,{
enumerable:false,
configurable:true,
Twritable:true,
value:value
});
};
delete Function.prototype.toString;
set_native(Function.prototype, "tostring", myToString);
set_native(Function.prototype.toString, symbol,"function tostring() { [native code] }");
globalThis.setNative = function (func, funcname) {
set_native(func, symbol, `function ${funcname || func.name || ''}() { [native code] }`);}
}();
//使用函数
setNative(get_menu_nav_open,"get_menu_nav_open")
//参数1 函数本体
//参数2 函数名称-字符串
//设置完了之后 就完成了函数native化
除此之外,我还在网上搜到一种简单的写法,与上面的代码大同小异,如下
//写法2
function set_native(func) {
func.toString = function () { return `function ${func.name}(){ [native code] }` }
func.prototype.toString = toString
return func
}
//直接把自己函数自身native吧
set_native(set_native)
今天的教程就到这里,希望对你有的开发有所帮助
By 壹影~~
呆毛飘啊飘
2023-02-18 23:12这个真的是66666666了
xvm
2023-02-14 16:26这个666