- apply和call的区别在哪里
- 什么状况下用apply,什么状况下用call
- apply的其余巧妙用法(通常在什么状况下可使用apply)
二、语法和参数分析:app
apply和call都能继承另一个对象的方法和属性;
Function.apply(obj,args)方法能接收两个参数
obj:这个对象将代替Function类里this对象
args:这个是数组,它将做为参数传给Function(args-->arguments)函数
call:和apply的意思同样,只不过是参数列表不同.
Function.call(obj,[param1[,param2[,…[,paramN]]]])
obj:这个对象将代替Function类里this对象
params:这个是一个参数列表post
三、call()和apply()示例展现:测试
/*定义一个Person类*/ function Person(name,age) { this.name=name; this.age=age; } /*定义一个学生类*/ function Student(name,age,grade) { //Person.apply(this,arguments);//特色:this指代student对象,只接收2个参数,arguments为隐式类数组对象,用来接收传入的参数; Person.call(this,name,age);//特色:this指代student对象,能够接收任意多个参数 this.grade=grade; } var student =new Student("zhangsan",22,"二年级");//方法Student()也是object的一个实例 //测试 alert("name:"+student.name+"\n"+"age:"+student.age+"\n"+"grade:"+student.grade); //学生类里面我没有给name和age属性赋值啊,为何又存在这两个属性的值呢,这个就是apply的神奇之处.
结果:this
name:zhangsan age:22 grade:"二年级"
分析: Person.apply(this,arguments);spa
this:在建立对象在这个时候表明的是studentprototype
arguments:是一个数组,也就是[“zhangsan”,”21”,”一年级”];code
也就是通俗一点讲就是:用student去执行Person这个类里面的内容,在Person这个类里面存在this.name等之类的语句,这样就将属性建立到了student对象里面对象
四、 什么状况下用apply,什么状况下用call
使用apply的状况:在给对象参数的状况下,若是参数的形式是数组的时候,好比apply示例里面传递了参数arguments,这个参数是数组类型。
使用call的状况: 若是个人Person的参数列表是这样的(age,name),而Student的参数列表是(name,age,grade),这样就能够用call来实现了,也就是直接指定参数列表对应值的位置(Person.call(this,age,name,grade));
五、apply的一些其余巧妙用法
细心的人可能已经察觉到,在我调用apply方法的时候,第一个参数是对象(this), 第二个参数是一个数组集合, 在调用Person的时候,他须要的不是一个数组,可是为何他给我一个数组我仍然能够将数组解析为一个一个的参数.
这个就是apply的一个巧妙的用处,能够将一个数组默认的转换为一个参数列表[param1,param2,param3] 转换为 param1,param2,param3这个若是让咱们用程序来实现将数组的每个项,来装换为参数的列表,可能都得费一会功夫,借助apply的这点特性,因此就有了如下高效率的方法:
a) Math.max 能够实现获得数组中最大的一项
由于Math.max 参数里面不支持Math.max([param1,param2]) 也就是数组
可是它支持Math.max(param1,param2,param3…),因此能够根据刚才apply的那个特色来解决 var max=Math.max.apply(null,array),这样轻易的能够获得一个数组中最大的一项(apply会将一个数组装换为一个参数接一个参数的传递给方法)
这块在调用的时候第一个参数给了一个null,这个是由于没有对象去调用这个方法,我只须要用这个方法帮我运算,获得返回的结果就行,.因此直接传递了一个null过去
b) Math.min 能够实现获得数组中最小的一项
一样和 max是一个思想 var min=Math.min.apply(null,array);
c) Array.prototype.push 能够实现两个数组合并
一样push方法没有提供push一个数组,可是它提供了push(param1,param,…paramN) 因此一样也能够经过apply来装换一下这个数组,即:
function add(a,b) { alert(a+b); } function sub(a,b) { alert(a-b); } add.call(sub,3,1);
分析:这个例子中的意思就是用 add 来替换 sub,add.call(sub,3,1) == add(3,1) ,因此运行结果为:alert(4); // 注意:js 中的函数实际上是对象,函数名是对 Function 对象的引用。
6.二、直接用B对象来执行A对象的方法function Class1() { this.name = "class1"; this.showNam = function() { alert(this.name); } } function Class2() { this.name = "class2"; } var c1 = new Class1(); var c2 = new Class2(); c1.showNam.call(c2);
function Class1() { this.showTxt = function(txt) { alert(txt); } } function Class2() { Class1.call(this); } var c2 = new Class2(); c2.showTxt("cc");