js中apply方法的使用详细解析


Posted in Javascript onNovember 04, 2013

1、对象的继承,一般的做法是复制:Object.extend
prototype.js的实现方式是:

Object.extend = function(destination, source) { 
    for (property in source) { 
        destination[property] = source[property]; 
    } 
    return destination; 
}

除此之外,还有种方法,就是:Function.apply(当然使用Function.call也是可以的)

apply方法能劫持另外一个对象的方法,继承另外一个对象的属性

Function.apply(obj,args)方法能接收两个参数

obj:这个对象将代替Function类里this对象

args:这个是数组,它将作为参数传给Function(args-->arguments)

apply示范代码如下:

<script> 
function Person(name,age){   //定义一个类,人类  
    this.name=name;     //名字  
    this.age=age;       //年龄 
    this.sayhello=function(){alert("hello")};
} 
function Print(){            //显示类的属性 
    this.funcName="Print"; 
    this.show=function(){      
        var msg=[];
        for(var key in this){ 
            if(typeof(this[key])!="function"){
                msg.push([key,":",this[key]].join(""));
            }
        } 
        alert(msg.join(" "));
    };
} 
function Student(name,age,grade,school){    //学生类 
    Person.apply(this,arguments);
    Print.apply(this,arguments);
    this.grade=grade;                //年级 
    this.school=school;                 //学校 
} 
var p1=new Person("jake",10);
p1.sayhello();
var s1=new Student("tom",13,6,"清华小学");
s1.show();
s1.sayhello();
alert(s1.funcName);
</script>

学生类本来不具备任何方法,但是在Person.apply(this,arguments)后,

他就具备了Person类的sayhello方法和所有属性。

在Print.apply(this,arguments)后就自动得到了show()方法

2、利用Apply的参数数组化来提高

Function.apply()在提升程序性能方面的技巧

我们先从Math.max()函数说起,Math.max后面可以接任意个参数,最后返回所有参数中的最大值。

比如
alert(Math.max(5,8))   //8
alert(Math.max(5,7,9,3,1,6))   //9

但是在很多情况下,我们需要找出数组中最大的元素。

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;
}

这样写麻烦而且低效。如果用 apply呢,看代码:
function getMax2(arr){
    return Math.max.apply(null,arr);
}

两段代码达到了同样的目的,但是getMax2却优雅,高效,简洁得多。

再比如数组的push方法。
var arr1=[1,3,4];
var arr2=[3,4,5];

如果我们要把 arr2展开,然后一个一个追加到arr1中去,最后让arr1=[1,3,4,3,4,5]
arr1.push(arr2)显然是不行的。 因为这样做会得到[1,3,4,[3,4,5]]

我们只能用一个循环去一个一个的push(当然也可以用arr1.concat(arr2),但是concat方法并不改变arr1本身)

var arrLen=arr2.length
for(var i=0;i<arrLen;i++){
    arr1.push(arr2[i]);
}

自从有了Apply,事情就变得如此简单
Array.prototype.push.apply(arr1,arr2)
Javascript 相关文章推荐
Extjs TriggerField在弹出窗口显示不出问题的解决方法
Jan 08 Javascript
extjs 初始化checkboxgroup值的代码
Sep 21 Javascript
Javascript 浮点运算精度问题分析与解决
Mar 26 Javascript
使用focus方法让光标默认停留在INPUT框
Jul 29 Javascript
js编写一个简单的产品放大效果代码
Jun 27 Javascript
js数字计算 误差问题的快速解决方法
Feb 28 Javascript
jquery+css实现侧边导航栏效果
Jun 12 jQuery
Vue.extend构造器的详解
Jul 17 Javascript
在vue项目中集成graphql(vue-ApolloClient)
Sep 08 Javascript
angular6的响应式表单的实现
Oct 10 Javascript
2019 年编写现代 JavaScript 代码的5个小技巧(小结)
Jan 15 Javascript
使用axios请求接口,几种content-type的区别详解
Oct 29 Javascript
js数组操作学习总结
Nov 04 #Javascript
Javascript执行效率全面总结
Nov 04 #Javascript
jquery的map与get方法详解
Nov 04 #Javascript
ajax请求get与post的区别总结
Nov 04 #Javascript
jquery text(),val(),html()方法区别总结
Nov 04 #Javascript
jquery获取一组checkbox的值(实例代码)
Nov 04 #Javascript
阻止事件(取消浏览器对事件的默认行为并阻止其传播)
Nov 03 #Javascript
You might like
Linux下实现PHP多进程的方法分享
2012/08/16 PHP
php连接与操作PostgreSQL数据库的方法
2014/12/25 PHP
PHP新建类问题分析及解决思路
2015/11/19 PHP
php微信公众平台配置接口开发程序
2016/09/22 PHP
PHP基于redis计数器类定义与用法示例
2018/02/08 PHP
常用Extjs工具:Extjs.util.Format使用方法
2012/03/22 Javascript
JS跨域代码片段
2012/08/30 Javascript
JS 退出系统并跳转到登录界面的实现代码
2013/06/29 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(一)
2015/12/10 Javascript
基于JavaScript实现通用tab选项卡(通用性强)
2016/01/07 Javascript
原生js实现autocomplete插件
2016/04/14 Javascript
jquery输入数字随机抽奖特效的简单实现代码
2016/06/10 Javascript
jQuery中clone()函数实现表单中增加和减少输入项
2017/05/13 jQuery
node实现定时发送邮件的示例代码
2017/08/26 Javascript
Vue文本模糊匹配功能如何实现
2020/07/30 Javascript
vue根据条件不同显示不同按钮的操作
2020/08/04 Javascript
[01:19:35]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第二局
2016/03/05 DOTA
[02:19]2018年度DOTA2最佳核心位选手-完美盛典
2018/12/17 DOTA
[01:54]TI珍贵瞬间系列(五):压力
2020/08/29 DOTA
[43:47]完美世界DOTA2联赛PWL S3 LBZS vs Phoenix 第一场 12.09
2020/12/11 DOTA
Python求解平方根的方法
2015/03/11 Python
python扫描proxy并获取可用代理ip的实例
2017/08/07 Python
python opencv实现任意角度的透视变换实例代码
2018/01/12 Python
Python异常对代码运行性能的影响实例解析
2018/02/08 Python
python生成不重复随机数和对list乱序的解决方法
2018/04/09 Python
Python+selenium 获取浏览器窗口坐标、句柄的方法
2018/10/14 Python
Python中base64与xml取值结合问题
2019/12/22 Python
Django模板标签{% for %}循环,获取制定条数据实例
2020/05/14 Python
用python实现学生管理系统
2020/07/24 Python
Meli Melo官网:名媛们钟爱的英国奢侈手包品牌
2017/04/17 全球购物
探亲假请假条
2014/04/11 职场文书
学生上课说话检讨书
2014/10/25 职场文书
2014年项目经理工作总结
2014/11/24 职场文书
社区端午节活动总结
2015/02/11 职场文书
幼儿园安全工作总结2015
2015/04/20 职场文书
幼儿园教师读书笔记
2015/06/29 职场文书