一、call

1、call供爷法则

 //    对象1
var myclass={
getAllStudentsNumbers:function(num1,num2){
return num1+num2;
}};
// 对象2
var student={
getDetail:function(){
return {name:'乐乐',like:'唱歌跳舞'}
}
};
//借用 供爷法则 student可以借用myclass的方法
//call和apply的区别 传参的不同
//call是所有参数平铺,apply是将参数放在数组中进行传递
console.log(myclass.getAllStudentsNumbers.call(student,10,20));//
console.log(myclass.getAllStudentsNumbers.apply(student,[10,20]));//
 //函数其实也是对象
function add(a, b)
{
console.log(a + b);
}
function sub(a, b)
{
console.log(a - b);
}
add.call(sub, 3, 1);//

2、call---this

  /*定义一个animal类*/
function Animal(){
this.name = "Animal";
this.showName = function(){
alert(this.name);
}
}
/*定义一个Cat类*/
function Cat(){
this.name = "Cat";
} /*创建两个类对象*/
var animal = new Animal();
var cat = new Cat(); //通过call或apply方法,将原本属于Animal对象的showName()方法交给当前对象cat来使用了。
//输入结果为"Cat"
animal.showName.call(cat,",");//Cat
//animal.showName.apply(cat,[]);

3、call使用场景---数组化

将伪数组转换为数组:

var domNodes =  Array.prototype.slice.call(divs);
 /*伪数组:只有数组的部分功能:length,下标,无法访问数组对象中的方法*/
var divs = document.getElementsByTagName("div")
console.log(divs.length);
/*说明他不是一个数组,无法访问里面的方法*/
// divs.pop().style.background='green' /*我们通过如下方式将其转换成数组*/
var domNodes = Array.prototype.slice.call(divs);
/*这样domNodes就可以应用Array下的所有方法了。*/ /* slice : 截取数组,返回的还是数组,这里我们截取全部 */
domNodes.pop().style.background='green';

二、apply

1、基本用法

  /*定义一个人类*/
function Person(name,age) {
this.name=name;
this.age=age;
} /*定义一个学生类*/
function Student(name,age,grade) {
Person.apply(this,arguments);
this.grade=grade;
} //创建一个学生类
var student=new Student("邓乐乐",24,"一年级");
//测试
document.write("姓名:"+student.name+"\n"+"年龄:"+student.age+"\n"+"年级:"+student.grade);//姓名:邓乐乐 年龄:24 年级:一年级
//大家可以看到测试结果name:邓乐乐 age:24 grade:一年级
//学生类里面我没有给name和age属性赋值啊,为什么又存在这两个属性的值呢,这个就是apply的神奇之处. //分析: Person.apply(this,arguments);
//
//this:在创建对象在这个时候代表的是student
//
//arguments:是一个数组,也就是[“邓乐乐”,”24”,”一年级”];
//
//也就是通俗一点讲就是:
// 用student去执行Person这个类里面的内容, 在Person这个类里面存在this.name等之类的语句,
// 这样就将属性创建到了student对象里面

2、巧妙用法

(1)Max函数用法

 // apply的一些其他巧妙用法
// 细心的人可能已经察觉到,在我调用apply方法的时候,
// 第一个参数是对象(this),
// 第二个参数是一个数组集合,
// 在调用Person的时候,他需要的不是一个数组,
// 但是为什么他给我一个数组我仍然可以将数组解析为一个一个的参数,
// 这个就是apply的一个巧妙的用处:可以将一个数组默认的转换为一个参数列表([param1,param2,param3] 转换为 param1,param2,param3) 这个如果让我们用程序来实现将数组的每一个项,来转换为参数的列表,
// 可能都得费一会功夫,借助apply的这点特性,所以就有了以下高效率的方法: // max函数用法
// Math.max后面可以接任意个参数,最后返回所有参数中的最大值。
console.log(Math.max(5,8)) //
console.log(Math.max(5,7,9,3,1,6)) // //但是在很多情况下,我们需要找出数组中最大的元素。 var arr=[5,7,9,1]
alert(Math.max(arr)) //这样却是不行的。因为其不支持传递数组过去 那么怎么做呢,就要考察我们的算法功底了。。 function getMax(arr){
var arrLen=arr.length;
for(var i=0,ret=arr[0];i<arrLen;i++){
ret=Math.max(ret,arr[i]);
}
return ret;
} //获取数组中的最大值
var max=Math.max.apply(null,[1,10,122,3335,333,34343,34343,5657767,2,34455,445466,45454,343434,46466,56556,464646,464646,466,4646464])
alert('最大值:'+max); // 整体解析:
// 因为Math.max 参数里面不支持Math.max([param1,param2]) 也就是数组
// 但是它支持Math.max(param1,param2,param3…),所以可以根据刚才apply的那个特点来解决
// var max=Math.max.apply(null,array),这样轻易的可以得到一个数组中最大的一项
// (apply会将一个数组装换为一个参数接一个参数的传递给方法)
// 第一个参数为什么是null:
// 这块在调用的时候第一个参数给了一个null,这个是因为没有对象去调用这个方法,
// 我只需要用这个方法帮我运算,得到返回的结果就行,.所以直接传递了一个null过去

(2)Min计算最小值

 //计算最小值
var min=Math.min.apply(null,[1,10,122,3335,333,34343,34343,5657767,2,34455,445466,45454,343434,46466,56556,464646,464646,466,4646464]);
alert('最小值:'+min);// //Math.min 可以实现得到数组中最小的一项
//同样和 max是一个思想 // Array.prototype.push 可以实现两个数组合并
// 同样push方法没有提供push一个数组,但是它提供了push(param1,param,…paramN)
// 所以同样也可以通过apply来装换一下这个数组,即: var arr1=new Array("1","2","3");
var arr2=new Array("4","5","6");
Array.prototype.push.apply(arr1,arr2);
alert(arr1);//1,2,3,4,5,6
alert(arr2);//4,5,6
//也可以这样理解,arr1调用了push方法,参数是通过apply将数组装换为参数列表的集合. // 传统写法
function PushArray(arr1,arr2){
var arrLen=arr2.length
for(var i=0;i<arrLen;i++){
arr1.push(arr2[i])
}
return arr1;
}
var result = PushArray(arr1,arr2);
console.log(result);//Array(9)

3、apply实现继承

 // apply实现继承
// 学生类本来不具备任何方法,
// 但是在 Person.apply(this,arguments) 后,
// 他就具备了 Person类的sayhello方法和 所有属性。
// 在 Print.apply(this,arguments) 后就自动得到了 show() 方法。 //人对象
function Person(name,age){ //定义一个类,人类
this.name=name; //名字
this.age=age; //年龄
this.sayhello=function(){console.log("人对象的某个方法")}
} //输出打印对象
function Print(){ //显示类的属性
this.funcName="我是打印对象";
this.show=function(){
console.log ('打印对象的某个方法');
}
} //学生对象
function Student(name,age,grade,school){ //学生类
Person.apply(this,arguments);
Print.apply(this,arguments);
this.grade=grade; //年级
this.school=school; //学校
} // 实例化人对象
var zhangsan=new Person("张三",10)
zhangsan.sayhello(); // 实例化学生对象
var lisi=new Student("tom",13,6,"清华小学")
// 学生继承了人和打印对象,则拥有了人的属性和方法
lisi.show();//打印对象的某个方法
lisi.sayhello();//人对象的某个方法
console.log(lisi.funcName);//我是打印对象

第195天:js---函数对象详解(call、apply)的更多相关文章

  1. JS变量对象详解

    JS变量对象详解 开年之后工作热情一直不是很高,这几天一直处于消极怠工状态.早上不想起床,起床了不想上班.明明放假之前工作热情还一直很高,一直心心念念的想把小程序项目怼出来,结果休假回来之后画风完全不 ...

  2. js对象系列【二】深入理解js函数,详解作用域与作用域链。

    这次说一下对象具体的一个实例:函数,以及其对应的作用域与作用域链.简单的东西大家查下API就行了,这里我更多的是分享自己的理解与技巧.对于作用域和作用域链,相信绝大多数朋友看了我的分享都能基本理解,少 ...

  3. 前端高质量知识(三)-JS变量对象详解

    在JavaScript中,我们肯定不可避免的需要声明变量和函数,可是JS解析器是如何找到这些变量的呢?我们还得对执行上下文有一个进一步的了解. 在上一篇文章中,我们已经知道,当调用一个函数时(激活), ...

  4. JS函数种类详解

    1. 普通函数1.1 示例 1 2 3 function ShowName(name) {   alert(name); } 1.2 Js中同名函数的覆盖 在Js中函数是没有重载,定义相同函数名.不同 ...

  5. JS DATE对象详解

    1.建立时间对象:可获取年,月,日,星期,时,分,秒 var d = new Date(); console.log(d.getFullYear()+'年'+d.getMonth()+'月'+d.ge ...

  6. JS window对象详解

    window 是客户端浏览器对象模型的基类,window 对象是客户端 JavaScript 的全局对象.一个 window 对象实际上就是一个独立的窗口,对于框架页面来说,浏览器窗口每个框架都包含一 ...

  7. JS中的event 对象详解

    JS中的event 对象详解   JS的event对象 Event属性和方法:1. type:事件的类型,如onlick中的click:2. srcElement/target:事件源,就是发生事件的 ...

  8. js对象详解(JavaScript对象深度剖析,深度理解js对象)

    js对象详解(JavaScript对象深度剖析,深度理解js对象) 这算是酝酿很久的一篇文章了. JavaScript作为一个基于对象(没有类的概念)的语言,从入门到精通到放弃一直会被对象这个问题围绕 ...

  9. JavaScript进阶知识点——函数和对象详解

    JavaScript进阶知识点--函数和对象详解 我们在上期内容中学习了JavaScript的基本知识点,今天让我们更加深入地了解JavaScript JavaScript函数 JavaScript函 ...

  10. jQuery的deferred对象详解 jquery回调函数

    http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html jQuery的 ...

随机推荐

  1. 20155215 《Java程序设计》实验二( Java面向对象程序设计)实验报告

    20155215 <Java程序设计>实验二( Java面向对象程序设计)实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉 ...

  2. 20155215 2016-2017-2 《Java程序设计》第4周学习总结

    20155215 2016-2017-2 <Java程序设计>第X周学习总结 教材学习内容总结 第六章 继承,避免多个类间重复定义共同行为.子类继承父类,再扩充(extends)其他行为. ...

  3. 20155223 2016-2017-2《Java程序设计》课程总结

    20155223 2016-2017-2<Java程序设计>课程总结 每周作业链接汇总 预备作业1 预备作业2 预备作业3 第一周 第二周 第三周 第四周 第五周 第六周 第七周 第八周 ...

  4. 20155302 2016-2017-2 《Java程序设计》 第1周学习总结

    20155302 2016-2017-2 <Java程序设计> 第1周学习总结 教材学习内容总结 浏览全书提出问题 chapter1:怎么保证现在系统在用最高版本的JRE呢?在哪里查看及升 ...

  5. [BZOJ2738]矩阵乘法-[整体二分+树状数组]

    Description 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. (N<=500,Q<=60000) Solution 考虑二分答案,问题转化为求矩阵内为1 ...

  6. 优步UBER司机全国各地奖励政策汇总 (4月18日-4月24日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  7. testNG-失败用例重跑机制

    下面简单介绍下testNG的失败重跑的实现方法: 1.首先编写一个类,实现IRetryAnalyzer类,重写其中的retry方法. public class TestNGRetry implemen ...

  8. CsvHelper文档-3写

    CsvHelper文档-3写 不用做任何设置,默认的情况下,csvhelper就可以很好的工作了.如果你的类的属性名称和csv的header名称匹配,那么可以按照下面的例子写入: var record ...

  9. 关于购买Redis服务器:腾讯云、阿里云还是华为云?

    个人分类: redis使用 编辑 新年伊始,很多商家都开始进行新年产品大促销,在分布是缓存Redis领域,几家大公司也是打得如火如荼,各有千秋啊. 现在市场上比较有口碑的商家有腾讯云.阿里云.华为云三 ...

  10. RC电路简介,RC串并联电路的工作原理及应用

    RC电路简介,RC串并联电路的工作原理及应用 RC电路全称Resistance-Capacitance Circuits.一个 相移电路(RC电路)或称 RC滤波器. RC网络, 是一个包含利用电压源 ...