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 相关文章推荐
javascript:void(0)的真正含义实例分析
Aug 20 Javascript
基于jquery的loading 加载提示效果实现代码
Sep 01 Javascript
jQuery $.each遍历对象、数组用法实例
Apr 16 Javascript
异步安全加载javascript文件的方法
Jul 21 Javascript
函数window.open实现关闭所有的子窗口
Aug 03 Javascript
详解如何使用Vue2做服务端渲染
Mar 29 Javascript
浅谈Koa2框架利用CORS完成跨域ajax请求
Mar 06 Javascript
promise和co搭配生成器函数方式解决js代码异步流程的比较
May 25 Javascript
小程序云开发如何实现图片上传及发表文字
May 17 Javascript
监控微信小程序中的慢HTTP请求过程详解
Jul 05 Javascript
JavaScript中判断为整数的多种方式及保留两位小数的方法
Sep 09 Javascript
vue+iview实现文件上传
Nov 17 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
php Undefined index的问题
2009/06/01 PHP
关于session在PHP5的配置文件中的详细设置参数说明
2011/04/20 PHP
基于PHP实现的多元线性回归模拟曲线算法
2018/01/30 PHP
javaScript arguments 对象使用介绍
2013/10/18 Javascript
node中socket.io的事件使用详解
2014/12/15 Javascript
jQuery的animate函数实现图文切换动画效果
2015/05/03 Javascript
jQuery自动添加表单项的方法
2015/07/13 Javascript
ajax如何实现页面局部跳转与结果返回
2015/08/24 Javascript
js实现省份下拉菜单效果
2017/02/15 Javascript
js读取json文件片段中的数据实例
2017/03/09 Javascript
详解JS获取HTML DOM元素的8种方法
2017/06/17 Javascript
angularjs利用directive实现移动端自定义软键盘的示例
2017/09/20 Javascript
小程序分页实践之编写可复用分页组件
2019/07/18 Javascript
JavaScript Event Loop相关原理解析
2020/06/10 Javascript
在GitHub Pages上使用Pelican搭建博客的教程
2015/04/25 Python
Python程序员面试题 你必须提前准备!
2018/01/16 Python
Python根据已知邻接矩阵绘制无向图操作示例
2018/06/23 Python
Python3.6实现带有简单界面的有道翻译小程序
2019/04/16 Python
Python基础学习之时间转换函数用法详解
2019/06/18 Python
python logging模块书写日志以及日志分割详解
2019/07/22 Python
python利用dlib获取人脸的68个landmark
2019/11/27 Python
Python openpyxl 插入折线图实例
2020/04/17 Python
Python 排序最长英文单词链(列表中前一个单词末字母是下一个单词的首字母)
2020/12/14 Python
python实现录制全屏和选择区域录屏功能
2021/02/05 Python
全球性的奢侈品梦工厂:Forzieri(福喜利)
2019/02/20 全球购物
巴西网上药店:Drogaria Araujo
2021/01/06 全球购物
自主招生自荐信范文
2013/12/04 职场文书
村官工作鉴定评语
2014/01/27 职场文书
幼儿园中班教学反思
2014/02/10 职场文书
根叔历年演讲稿
2014/05/20 职场文书
地球物理学专业推荐信
2014/09/08 职场文书
2014乡镇班子个人对照检查材料思想汇报
2014/09/26 职场文书
2014年房地产工作总结范文
2014/11/19 职场文书
团员个人总结
2015/02/26 职场文书
四则混合运算教学反思
2016/02/23 职场文书
分家协议书范本
2016/03/22 职场文书