js笔记三十八之call方法深入

// 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
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 8,181评论 2 17
  • 一切皆对象 js中的一个常见运算符 typeof 以上代码列出了 typeof 输出的集中类型标识, 其中上面的四...
    无迹落花阅读 2,101评论 0 5
  • 0 写在前面的话 大多数的面向对象编程语言中,比如C++和Java,在使用他们完成任务之前,必须创建类(class...
    自度君阅读 1,148评论 0 3
  • 当年织女下凡洗澡,认识了牛郎,演绎了一段惊天泣地的爱情故事。 赵灵儿在外面洗澡,碰上了李逍遥,上演一出仙侣奇缘。 ...
    海盗lucifer阅读 201评论 0 0
  • 今天姬老师来亚运村会员中心,交流了一下午,深感做人做事要有底线,人与人之间要念些情,才有意思
    农爸爸阅读 197评论 0 0

友情链接更多精彩内容