JS中call()和apply()的用法

来源:互联网 发布:java多久可以学会 编辑:程序博客网 时间:2024/05/01 05:40

使用语法:

  • apply和call都能继承另外一个对象的属性和方法。
  • Function.apply(obj,args)方法能接受两个参数。
  • obj:这个对象将代替Function类里面的this对象。
  • args:这个数组将作为参数传递给Function。
  • call和apply的意识一样,只是参数列表不一样。
  • Function.call(obj,param1,param ,…)。
  • obj:这个对象将代替Function类里面的this对象。
  • param1:这是一个参数列表。

代码分析:

        function Person(name,age){                this.name=name;                this.age=age;            }            function Student(name,age,grade){                //Person.apply(this,[name,age]);                //Person.apply(this,arguments);                Person.call(this,name,age);                this.grade=grade;            }            var student1=new Student("Mike",12,"三年级");            console.log("name:"+student1.name+"\n age:"+student1.age+"\n grade:"+student1.grade);

运行结果:
name:Mike
age:12
grade:三年级
分析:
Person.call(this,name,age);这里的this在创建对象的时候指代的是Student对象,也就是说用Student去执行Person类里面的内容,在Person类里面存在this.name等之类的语句,这样就将属性创建到了Student对象里面。

apply的一些其他用法:

  • apply可以将一个默认的数组转换为参数列表,列入,我们的[param1,param2,param3]转换为param1,param2,param3,这也就是为什么我们可以进行这样传递参数。
  • 用apply获取数组的求最大值最小值,Math.max(param)参数里面不支持数组。
            var b=(1,2,3);            console.log(Math.max(b));//3            var a=[1,2,34,21,4];            var maxNum=Math.max.apply(null,a);            console.log(maxNum);//34            var minNum=Math.min.apply(null,a);            console.log(minNum);//1
  • Array.prototype.push.apply可以实现两个数组的合并
            var arr1=[1,2,3,4];            var arr2=[5,6,7,8];            arr1.push(arr2);            console.log(arr1);//[1,2,3,4,Array(4)]            console.log(arr2);//[5,6,7,8]            Array.prototype.push.apply(arr1,arr2);            console.log(arr1); //[1,2,3,4,5,6,7,8]            console.log(arr2);//[5,6,7,8]

分析:appl会将数组arr2隐式的转换为一个一个值,进行push。

call的一些其他用法:

  • 对象的替换,直接用A对象替换B对象
            function add(a,b){                console.log(a+b);            }            function sub(a,b){                console.log(a-b);            }            add.call(sub,3,1) //4 用add来替换sub
  • 直接用B对象来执行A对象中的方法
            function Class1(name){                this.name=name;                this.showName=function(){                    console.log(this.name);                }            }                       function Class2(name){                this.name=name;            }            var c1=new Class1("mike");            var c2=new Class2("lili");            c1.showName.call(c2);//lili

分析:call的意识是把c1的方法放到c2上执行。

  • 使用call实现继承
            function Class1(){                this.showText=function(text){                    console.log(text);                }            }            function Class2(){                Class1.call(this);            }            var c2=new Class2();            c2.showText("Hello!");//Hello!

分析:c2没有的属性和方法,通过call来继承。

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 公历阳历转换 公历生日查询 公历是阴历阳历 公历藏历对照表 农历公历转换 公历农历转换公式 公历转换成农历 农历转换公历对照表 公历转换农历 公历是阴历吗 农历换算公历 公历换算农历 农历转公历查询 中国黄历 农历1967年与公历对照表 生日过农历还是公历 我国是什么时候采用公历的 附近公厕 公厕 公厕新娘 公厕雪莲 定点公厕 精液公厕 潘婕是公厕 移动公厕吧 定点公厕39 公厕所 环保公厕 生态公厕 公厕电话 公厕价格 公厕标识牌 公厕改造 公厕隔断 公园公厕 整体公厕 公厕指示牌 公厕女 公厕拍 简易公厕 公厕效果图