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的复制网页内容到WORD的实现代码
Feb 16 Javascript
javascript返回顶部效果(自写代码)
Jan 06 Javascript
JavaScript实现从数组中选出和等于固定值的n个数
Sep 03 Javascript
PHP+mysql+Highcharts生成饼状图
May 04 Javascript
禁止按回车键提交表单的方法
Jun 11 Javascript
浅谈mint-ui 填坑之路
Nov 06 Javascript
使用mock.js随机数据和使用express输出json接口的实现方法
Jan 07 Javascript
vue源码学习之Object.defineProperty对象属性监听
May 30 Javascript
JS中的两种数据类型及实现引用类型的深拷贝的方法
Aug 12 Javascript
node.JS事件机制与events事件模块的使用方法详解
Feb 06 Javascript
javascript中的offsetWidth、clientWidth、innerWidth及相关属性方法
May 14 Javascript
Vue操作Storage本地化存储
Apr 29 Vue.js
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
Laravel5.1 框架Middleware中间件基本用法实例分析
2020/01/04 PHP
jquery URL参数判断,确定菜单样式
2010/05/31 Javascript
javascript学习笔记(三)显示当时时间的代码
2011/04/08 Javascript
关于js内存泄露的一个好例子
2013/12/09 Javascript
借助JavaScript脚本判断浏览器Flash Player信息的方法
2014/07/09 Javascript
jQuery对象和DOM对象之间相互转换的方法介绍
2015/02/28 Javascript
JavaScript 浏览器兼容性总结及常用浏览器兼容性分析
2016/03/30 Javascript
JQuery给select添加/删除节点的实现代码
2016/04/26 Javascript
jQuery使用中可能被XSS攻击的一些危险环节提醒
2016/05/24 Javascript
深入浅出ES6新特性之函数默认参数和箭头函数
2016/08/01 Javascript
jquery实现页面加载效果
2017/02/21 Javascript
JS实现移动端按首字母检索城市列表附源码下载
2017/07/05 Javascript
详解微信小程序中的页面代码中的模板的封装
2017/10/12 Javascript
微信小程序实现折叠面板
2018/01/31 Javascript
微信小程序视图控件与bindtap之间的问题的解决
2019/04/08 Javascript
JavaScript实现更换背景图片
2019/10/18 Javascript
VSCode搭建Vue项目的方法
2020/04/30 Javascript
JS寄快递地址智能解析的实现代码
2020/07/16 Javascript
[46:14]VGJ.T vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
手把手教你python实现SVM算法
2017/12/27 Python
解决python3中解压zip文件是文件名乱码的问题
2018/03/22 Python
python使用Plotly绘图工具绘制气泡图
2019/04/01 Python
Django实现后台上传并显示图片功能
2020/05/29 Python
KIKO比利时官网:意大利彩妆品牌
2017/07/23 全球购物
意大利简约的休闲品牌:Aspesi
2018/02/08 全球购物
大学生军训自我评价分享
2013/11/09 职场文书
工商管理系学生的自我评价分享
2013/11/29 职场文书
幼儿园五一活动方案
2014/02/07 职场文书
公司授权委托书
2014/04/04 职场文书
遗嘱公证书标准样本
2014/04/08 职场文书
写求职信要注意什么问题
2014/04/12 职场文书
校园活动策划方案
2014/06/13 职场文书
七夕活动策划方案
2014/08/16 职场文书
2016年全国爱牙日宣传活动总结
2016/04/05 职场文书
2019年员工晋升管理制度范本!
2019/07/08 职场文书
html实现随机点名器的示例代码
2021/04/02 Javascript