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知识点收藏
Feb 22 Javascript
jQuery jqgrid 对含特殊字符json 数据的 Java 处理方法
Jan 01 Javascript
JavaScript中用于生成随机数的Math.random()方法
Jun 15 Javascript
全国省市二级联动下拉菜单 js版
May 10 Javascript
Bootstrap表格使用方法详解
Feb 17 Javascript
jquery.guide.js新版上线操作向导镂空提示jQuery插件(推荐)
May 20 jQuery
Vue2.0 axios前后端登陆拦截器(实例讲解)
Oct 27 Javascript
记一次vue去除#问题处理经过小结
Jan 24 Javascript
jQuery实现当拉动滚动条到底部加载数据的方法分析
Jan 24 jQuery
layui table动态表头 改变表格头部 重新加载表格的方法
Sep 21 Javascript
微信小程序实现发微博功能的示例代码
Jun 24 Javascript
vue在App.vue文件中监听路由变化刷新页面操作
Aug 14 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 session 错误
2009/05/21 PHP
Fatal error: Call to undefined function curl_init()解决方法
2010/04/09 PHP
一个PHP的String类代码
2010/04/20 PHP
YII Framework框架教程之国际化实现方法
2016/03/14 PHP
php利用header函数下载各种文件
2016/08/24 PHP
php实现微信企业付款到个人零钱功能
2018/10/09 PHP
PHP get_html_translation_table()函数用法讲解
2019/02/16 PHP
JavaScript 对话框和状态栏使用说明
2009/10/25 Javascript
AngularJS入门教程(二):AngularJS模板
2014/12/06 Javascript
AngularJS中的模块详解
2015/01/29 Javascript
基于jQuery实现的向下滑动二级菜单效果代码
2015/08/31 Javascript
JavaScript设计模式初探
2016/01/07 Javascript
基于jquery实现表格无刷新分页
2016/01/07 Javascript
JS实现中国公民身份证号码有效性验证
2017/02/20 Javascript
angular十大常见问题
2017/03/07 Javascript
webpack公共组件引用路径简化小技巧
2018/06/15 Javascript
AngularJS实现与后台服务器进行交互的示例讲解
2018/08/13 Javascript
深入浅析Vue.js 中的 v-for 列表渲染指令
2018/11/19 Javascript
vue3.0中使用postcss-pxtorem的具体方法
2019/11/20 Javascript
[59:35]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第二局
2016/03/04 DOTA
python解析xml文件实例分享
2013/12/04 Python
Python里disconnect UDP套接字的方法
2015/04/23 Python
对python requests的content和text方法的区别详解
2018/10/11 Python
Python 画出来六维图
2019/07/26 Python
Python3.7黑帽编程之病毒篇(基础篇)
2020/02/04 Python
世界上最全面的草药补充剂和顶级品牌维生素网站:HerbsPro
2019/01/20 全球购物
数控技术应届生求职信
2013/11/13 职场文书
大学军训感言600字
2014/02/25 职场文书
现场施工员岗位职责
2014/03/10 职场文书
大学三年计划书范文
2014/04/30 职场文书
局火灾防控工作方案
2014/05/25 职场文书
2014年乡镇民政工作总结
2014/12/02 职场文书
交通事故案件代理词
2015/05/23 职场文书
《狼牙山五壮士》教学反思
2016/02/17 职场文书
golang日志包logger的用法详解
2021/05/05 Golang
python中opencv实现图片文本倾斜校正
2021/06/11 Python