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下查找父节点的简单方法
Aug 13 Javascript
Js组件的一些写法
Sep 10 Javascript
jquery获得同源iframe内body下标签的值的方法
Sep 25 Javascript
浅析js的模块化编写 require.js
Dec 07 Javascript
JS经典正则表达式笔试题汇总
Dec 15 Javascript
React-Native左右联动List的示例代码
Sep 21 Javascript
vue axios 二次封装的示例代码
Dec 08 Javascript
基于vue-cli配置lib-flexible + rem实现移动端自适应
Dec 26 Javascript
JavaScript 中的12种循环遍历方法【总结】
May 31 Javascript
jQuery实现动态加载select下拉列表项功能示例
May 31 jQuery
jQuery pager.js 插件动态分页功能实例分析
Aug 02 jQuery
JavaScript实现H5接金币功能(实例代码)
Feb 22 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
遍历指定目录下的所有目录和文件的php代码
2011/11/27 PHP
记录PHP错误日志 display_errors与log_errors的区别
2012/10/09 PHP
php实现图片上传、剪切功能
2016/05/07 PHP
Yii2中cookie用法示例分析
2016/07/18 PHP
in.js 一个轻量级的JavaScript颗粒化模块加载和依赖关系管理解决方案
2011/07/26 Javascript
40款非常棒的jQuery 插件和制作教程(系列一)
2011/10/26 Javascript
JS 对输入框进行限制(常用的都有)
2013/07/30 Javascript
js 处理数组重复元素示例代码
2013/12/27 Javascript
Jquery给基本控件的取值、赋值示例
2014/05/23 Javascript
javascript中setTimeout和setInterval的unref()和ref()用法示例
2014/11/26 Javascript
javascript轻量级库createjs使用Easel实现拖拽效果
2016/02/19 Javascript
Immutable 在 JavaScript 中的应用
2016/05/02 Javascript
从零学习node.js之mysql数据库的操作(五)
2017/02/24 Javascript
jQuery插件zTree实现删除树节点的方法示例
2017/03/08 Javascript
Angular5中调用第三方js插件的方法
2018/02/26 Javascript
security.js实现的RSA加密功能示例
2018/06/06 Javascript
vue router 配置路由的方法
2018/07/26 Javascript
Vue时间轴 vue-light-timeline的用法说明
2020/10/29 Javascript
Python的argparse库使用详解
2018/10/09 Python
python Django的web开发实例(入门)
2019/07/31 Python
TensorFlow2.1.0最新版本安装详细教程
2020/04/08 Python
使用Python绘制台风轨迹图的示例代码
2020/09/21 Python
Django路由层URLconf作用及原理解析
2020/09/24 Python
canvas实现漂亮的下雨效果的示例
2018/04/18 HTML / CSS
Alexandre Birman美国官网:亚历山大·伯曼
2019/10/30 全球购物
交通事故赔偿协议书
2014/04/15 职场文书
英语课前三分钟演讲稿(6篇)
2014/09/13 职场文书
2014年大学宣传部工作总结
2014/12/19 职场文书
防汛通知
2015/04/25 职场文书
2015年人事科工作总结
2015/04/28 职场文书
担保书格式范文
2015/09/22 职场文书
女方家长婚礼答谢词
2015/09/29 职场文书
导游词之阆中古城
2019/12/23 职场文书
Javascript之datagrid查询详解
2021/09/15 Javascript
python利用while求100内的整数和方式
2021/11/07 Python
使用pd.merge表连接出现多余行的问题解决
2022/06/16 Python