先用通俗易懂的语言让我们知道他的用法,再去以专业的角度去正确理解这个知识点!!!
如果哪位大神不小心看见我的博客 可以指点一下!!!
主要是看例子,帮助你用最短的时间学会去使用和做一个大概的理解
先了解为什么要用 和 用了有什么便利!
最原始的例子:
我有一辆保时捷跑车,平时有什么事情我会开着他出去,但是我弟弟今天要去见女朋友,你说他是再买一个呢还是用我的呢??
当然是用我的,一家人嘛!
从这个例子可以看出,弟弟为什么要用我的,因为他没有, 用了有什么好处?他不必再花钱去买。
在这个基础上再去看看实践,如下:
call:
语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) ;
定义:调用一个对象的一个方法,以另一个对象替换当前对象;
说明:call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
apply:
语法:apply([thisObj[,argArray]])
定义:应用某一对象的一个方法,用另一个对象替换当前对象。
说明: 如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。
如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。
通俗易懂示例:
a.
- function add(a,b)
- {
- alert(a+b);
- }
- function sub(a,b)
- {
- alert(a-b);
- }
- add.call(sub,3,1);
b.
- function Animal(){
- this.name = "Animal";
- this.showName = function(){
- alert(this.name);
- }
- }
- function Cat(){
- this.name = "Cat";
- }
- var animal = new Animal();
- var cat = new Cat();
- animal.showName.call(cat,",");
animal.showName.call(cat,",");的意思是把animal中的showName方法放在cat中;也就是说cat之后也就有了animal中的showName方法;
c.实现继承
- function Animal(name){
- this.name = name;
- this.showName = function(){
- alert(this.name);
- }
- }
- function Cat(name){
- Animal.call(this, name);
- }
- var cat = new Cat("Black Cat");
- cat.showName();
d.多重继承
- function Class10()
- {
- this.showSub = function(a,b)
- {
- alert(a-b);
- }
- }
- function Class11()
- {
- this.showAdd = function(a,b)
- {
- alert(a+b);
- }
- }
- function Class2()
- {
- Class10.call(this);
- Class11.call(this);
- }
call和apply比较:
相同点:
都能够改变方法的执行上下文(执行环境),将一个对象的方法交给另一个对象来执行,并且是立即执行
不同点:
1.call可以有多个参数,并且从第二个参数开始可以是任意类型
2.apply只能有两个参数,而且第二个参数只能是一个数组或者类数组
简单说一下类数组的概念:
类数组根据字面意思来理解就是一种类似于数组的另一种类型
eg:
var arrayLike = { 0: 'item1', 1: 'item2', 2: 'item3', length: 3 }
这样的数组类型就是类数组,他拥有数组的属性:
1.可以通过角标来获取 2.可以通过for循环进行遍历 3.具有length属性但是类数组却不能通过forEach
进行遍历,因为forEach
是数组原型链上的方法,类数组毕竟不是数组,所以无法使用!如果你看到了这里就有必要了解一下 关于call和apply这个知识点 有一个专业词是:“执行上下文”所谓的执行上下文也就是指我们平时在函数中用到的this的执行环境,而call和apply的本质: 其实就是改变this的执行环境,而不是前面所说的谁把谁的方法给了谁(前面是为了方便理解);
说到这里有的人会问 什么时候用call,什么时候用apply呢? 首先我们知道 函数有个最重要的内容就是参数---》
那么每个函数都有参数吗? 每个函数的参数都是一个吗? 每个函数的参数都是变量吗? 所以当没有参数或者只有一个参数的时候我们就用call! 当要传入多个参数的时候就用apply! 或者:当你传入的参数就是一个数组或者类数组就直接用apply! 如果你的参数需要逐条加入就用call!