call 和 apply 的认识

之前写的文章感觉好幼稚,原因是这几个月我又提高了不少。
之前的文章就别看了,自己也不想看:),但是是我的成长的一段经历。

今天谈谈javascript 的 call() 和 apply()方法的认识。

首先,他们是什么东西?(不是骂他们哦)

他们是Function.prototype的方法。

如何理解他们的用法呢?
  foo.call(this, arg1,arg2,arg3)
== foo.apply(this, arguments)
== this.foo(arg1, arg2, arg3)

这只是去理解它们的用法
this.foo()肯定调不到foo方法,因为this里面可能根本没有去设置foo这个方法,这个foo其实是人家的foo,this很喜欢这个方法,想去偷过来自己用。那就喊call和apply两兄弟去偷。

this怎么理解呢?

var abc = function(a, b){
    return a + b
}

var Abc = function(){
    this.name = 'abc',
    this.age = 11,
    this.sum = function(){
        return window.abc.call(this, 1, 2)
    }
}

var a = new Abc();
alert(a.sum()) //自己试

无中生有是不是很贱。。

至于为什么要写window.abc呢?
为什么呢?
既然你可以从window家里偷abc,当然也可以去其他家里偷abc啊!!

演示一遍

var ABc = function(){
    this.sum = function(a, b){
            return a + b
    }
}
var b = new ABc();

var Abc = function(){
    this.name = 'abc',
    this.age = 11,
    this.sum = function(){
        return b.sum.call(this, 1, 2)
    }
}

var a = new Abc();
alert(a.sum())

为什么ABc要先实例化呢??
因为你不实例化,他不算一个对象。而call 和apply 相当于是Function.prototype的一个方法。这个怎么理解呢?什么是Function.prototype?

var ABc = function(){
    this.sum = function(a, b){
            return a + b
    }
}
ABc.prototype = {
    init: function(a, b){
        return '参数是' + a + b
    }
}
var b = new ABc();


var Abc = function(){
    this.name = 'abc',
    this.age = 11,
    this.sum = function(){
        return b.init.call(this, 1, 2)
    }
}

var a = new Abc();
alert(a.sum())

而call 和 apply 相当于ABc后台已经定义好了的方法。
ABc.prototype.call = function(){…}

prototype 什么意思呢? 这个不知道的话暂时就不解释了。

就是所有的实例化对象都能用到的属性。就像共产主义,这里定义的东西大家都能用,免费用。只要你是共产主义者。只要你是这个构造函数的实例化对象。

至于call 和 apply的差别呢?
就是参数的差别。一看就明白了。
如果传的参数数量固定可以用call,如果不固定就用apply呗。

写的可能有问题,或者写的不全,这个也是自己的一个暂时的认知,希望伙伴们能多多指出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值