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 相关文章推荐
jquery控制左右箭头滚动图片列表的实例
May 20 Javascript
js数组的基本用法及数组根据下标(数值或字符)移除元素
Oct 20 Javascript
jquery操作复选框(checkbox)的12个小技巧总结
Feb 04 Javascript
高性能JavaScript 重排与重绘(2)
Aug 11 Javascript
详解Angular开发中的登陆与身份验证
Jul 27 Javascript
Vuejs第十一篇组件之slot内容分发实例详解
Sep 09 Javascript
AngularJS过滤器filter用法实例分析
Nov 04 Javascript
原生Javascript插件开发实践
Jan 18 Javascript
js实现日历的简单算法
Jan 24 Javascript
js实现文字选中分享功能
Jan 25 Javascript
js模态对话框使用方法详解
Feb 16 Javascript
JS前端广告拦截实现原理解析
Feb 17 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
纯真IP数据库的应用 IP地址转化成十进制
2009/06/14 PHP
php处理斐波那契数列非递归方法
2012/02/04 PHP
php中把美国时间转为北京时间的自定义函数分享
2014/07/28 PHP
php按单词截取字符串的方法
2015/04/07 PHP
Laravel中前端js上传图片到七牛云的示例代码
2017/09/04 PHP
PHP排序二叉树基本功能实现方法示例
2018/05/26 PHP
php微信公众号开发之校园图书馆
2018/10/20 PHP
js实现瀑布流的一种简单方法实例分享
2013/11/04 Javascript
jquery单行文字向上滚动效果示例
2014/03/06 Javascript
直接拿来用的15个jQuery代码片段
2015/09/23 Javascript
谈谈我对JavaScript中typeof和instanceof的深入理解
2015/12/25 Javascript
javascript 动态生成css代码的两种方法
2017/03/17 Javascript
vue实现动态数据绑定
2017/04/28 Javascript
vue绑定的点击事件阻止冒泡的实例
2018/02/08 Javascript
element-ui表格数据转换的示例代码
2018/08/24 Javascript
你不知道的SpringBoot与Vue部署解决方案
2020/11/09 Javascript
python utc datetime转换为时间戳的方法
2019/01/15 Python
python实现雪花飘落效果实例讲解
2019/06/18 Python
python实现大战外星人小游戏实例代码
2019/12/26 Python
使用python matploblib库绘制准确率,损失率折线图
2020/06/16 Python
在线服装零售商:SheIn
2016/07/22 全球购物
在网上学习全世界最好的课程:Coursera
2017/11/07 全球购物
巴黎一票通:The Paris Pass
2018/02/10 全球购物
Book Depository澳大利亚:世界领先的专业在线书店之一
2018/12/27 全球购物
Helly Hansen工作服美国官方网上商店:为最恶劣的环境
2019/09/04 全球购物
调解员先进事迹材料
2014/02/07 职场文书
合唱兴趣小组活动总结
2014/07/10 职场文书
政风行风整改方案
2014/10/25 职场文书
公务员年终个人总结
2015/02/12 职场文书
大学生逃课检讨书
2015/05/04 职场文书
项目验收申请报告
2015/05/15 职场文书
体育部部长竞选稿
2015/11/21 职场文书
篮球拉拉队口号
2015/12/25 职场文书
2019年最新感恩节祝福语(28句)
2019/11/27 职场文书
HashMap实现保存两个key相同的数据
2021/06/30 Java/Android
MySQL的全局锁和表级锁的具体使用
2021/08/23 MySQL