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)