重温JS——劫持(逆向工程、系统的内置功能的重写、this关键字的引用劫持)

1、黑客劫持网络数据包 然后暴力解码(逆向工程),个人隐私数据窃取了

2、系统的内置功能的重写

3、this关键字的引用劫持

一、黑客劫持网络数据包 然后暴力解码(逆向工程),个人隐私数据窃取了

二、系统的内置功能的重写

 //打印hello,然后把hello发送给后台
        function mylog(str) {
            window.console.log("hello")
            //这里是把hello发送给后台的代码,后面学
        }
        window.mylog("hello")

        //既保留了官方的功能,又添加了一些功能
        var _log=console.log
        console.log=function (str) {
            _log(str)
            //把hello发送给后台
            _log("发给后台")
        }
        console.log("hai")  //后面的console.log,都会打印,然后把内容发送给后台

        obj.age=20  //重写点语法,可以存属性值,还有其他的功能

三、this关键字的引用劫持

  引入

        var obj={name:"karen",say:function(){console.log(this)}}

        var obj2={name:"jack"}

        obj.fn=obj.say //函数可以被obj2访问 也可以被obj访问

1、call       

var obj={name:"karen",say:function(arg1,arg2){console.log(this.name,arg1,arg2)}}
var obj2={name:"jack"}
obj.say.call(obj2,10,20)  //相当于是obj2在调用say方法  结果为:jack 10 20

2、apply  

call 和 apply 区别:传参的方法不一样 

      var obj={name:"karen",say:function(arg1,arg2){console.log(this.name,arg1,arg2)}}

        var obj2={name:"jack"}

        obj.say.apply(obj2,[10,20])    //jack 10 20

       

        var obj={name:"karen",say:function(arg1,arg2){console.log(this.name,arg1,arg2,arguments)}}

        var obj2={name:"jack"}

        obj.say.apply(obj2,[10,20,80,90])   //jack 10 20 Arguments(4) [10, 20, 80, 90, callee: ƒ, Symbol(Symbol.iterator): ƒ]



       //案例:求数组的最大的数

        var re=Math.max(10,203,4,5)
        var arr=[10,230,40,6,2]
        var maxnum=Math.max.apply(0,arr)  //0代表this,arr:把数组的所有元素传进去作为实参
        console.log(maxnum)  //203

        /*
        obj.say.apply(obj3,[10,20]) 的解释:
        相当于假装obj3也有say方法
        就相当于obj.say(10,20)

        arr=[10,230,40,6,2]
        var maxnum=Math.max.apply(0,arr) 的解释:
        相当于假装0也有max方法。这里的0是this,这里谁调用不重要
        就相当于0.max(10,230,40,6,2)
        */

3、bind : 定义式的函数可以在设计的时候就指定this     

        var obj2={name:"jack"}
        var obj={
            name:"karen",
            say:function(){
                cosnoel.log(this)
            }.bind(obj2)  //以后的this都是obj2
        }
        obj.say()
        var obj3={name:"marry"}
        obj.say.call(obj3)//代码的调用者是obj3,但是bind的原因,还是obj2

 obj.say.call(obj2)

根据官方的源代码推出的一些规律

1、所有的函数对象都有call方法---Function.prototype  有call方法

2、运行的函数是say函数 ( 哪个函数调用call方法,就是运行哪个函数)

3、调用这个函数的对象是obj2

    //拓展

    function fn () {
        console.log(1)
    }
    function fn () {
        console.log(2)
    }
    fn.call.call(fn2)
    /*fn.call是一个函数,它有call方法
    fn.call 引用了一个函数 这个函数运行
    fn.call 是一个函数,fn2是调用者
    那就是相当于fn2.fn.call = fn2.call   (fn.call=call=fn2.call)
    */

    //源代码
    //知识点准备
    delete obj.age  //删除对象的成员  (delete是一个操作符)
    obj.age=null    //这个是有意义的,与上一行代码不一样
    //代码
    Function.prototype.mycall=function(That,ars) {
        var name1="hai_"+new Date()
        That[name1]=this
        var re=That[name1](args)
        delete That[name1]
        return re
    }
    obj.say.mycall(obj2,100,200)
    //上一行等价于 obj2.say(100,200)  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值