JS:劫持2(call()、mycall())
一些规律:
1.所有的函数对象都有call方法---Function.prototype 有call方法
2.obj.say.call(obj2) 运行的函数是say函数(哪个函数调call方法就是哪个函数运行)
3.obj.say.call(obj2) 调用这个函数的对象是obj2(obj2调用say函数)
自定义的mycall方法:
Function.prototype.mycall = function (That, args) { //哪个函数调用mycall方法就是哪个函数运行 // 调用这个函数的对象是That this(args); } var obj = { name:'lili', say : function(args){ console.log('say',args,this); } } obj.say.mycall(obj2, 100, 200); var obj2 = { age:10; };
打印结果:
say 100 Window {window: Window, self: Window, document: document, name: '', location: Location, …}
注:obj.say.mycall(obj2, 100, 200);
等价于
obj2.say=obj.say;
obj2.say(100,200);