- // Array.prototype.slice -> function(){}
- var ary = [12,23,34];
- ary.slice()
- // ary.slice -> ary 这个实例通过原型链的查找机制找到 Array.prototype 上的 slice 方法
- // ary.slice() -> 让找到的 slice 方法执行, 在执行 slice 方法的过程中, 才把 ary 数组进行了截取
call 改变 this 关键字
- // Function.prototype.call = function(){};
- var obj = {name:"lilei"};
- function fn(){
- console.log(this);
- }
- fn(); // -> window
- obj.fn(); // -> Uncaught TypeError: obj.fn is not a function
- fn.call(obj) // -> {name: "lilei"}
call 方法的作用:
首先我们让原型上的 call 方法执行, 在执行 call 方法的时候, 我们放 fn 方法中的 this 变为第一个参数值 obj, 然后再把 fn 这个函数执行;
- // 重写 call 方法
- Function.prototype.myCall = function (context){
- // -> myCall 方法中的 this 就是当前要操作和改变其 this 关键字的那个函数名
- // -> 1. 让 fn 中的 this 关键字变为 context 的值 -> obj
- // -> 让 this 这个函数中的 "this 关键字" 变为 context
- // this.toString().replace("this","obj")
- // -> 2. 让 fn 方法在执行
- // this()
- };
- fn.myCall(obj); // -> myCall 方法中的 this 是 fn
- sum.myCall(obj) // -> myCall 方法中的 this 是 sum
- function sum(){
- };
- function fn1(){console.log(1);}
- function fn2(){console.log(2);}
- fn1.call(fn2) // -> 1
- // -> 首先 fn1 通过原型链机制找到 Function.prototype 上的 call 方法, 并且让 call 方法执行
- // -> 此时 call 这个方法中的 this 就是我们要操作的 fn1
- // -> 在 call 方法代码执行的过程中首先让 fn1 中的 "this 关键字" 变成 fn2 , 然后在让 fn1 这个方法执行
- fn1.call.call(fn2) // -> 2
- // -> fn1.call 首先 fn1 通过原型链找到 Function.prototype 上的 call 方法
- // -> 然后在让 call 方法通过原型在找到 Function 原型上的 call
- // -> (因为 call 本身的值也是一个函数, 所以同样可以找到 Function.prototype)
- // -> 在第二次再找到 call 的时候让方法执行, 方法中的 this 是 fn1.call
- // -> 首先让这个方法中的 this 变为 fn2, 然后再让 fn1.call 执行
- fn1.call.call.call.call.call(fn2) // -> 2
- Function.prototype.call(fn1); // 什么都不输出
- Function.prototype.call.call.call(fn1); // -> 1
来源: http://www.jianshu.com/p/4e1669fee27d