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 photoFrame 图片边框美化显示插件
Jun 28 Javascript
aspx中利用js实现确认删除代码
Jul 22 Javascript
javascript 正则表达式相关应介绍
Nov 27 Javascript
js 赋值包含单引号双引号问题的解决方法
Feb 26 Javascript
js中回调函数的学习笔记
Jul 31 Javascript
Node.js中创建和管理外部进程详解
Aug 16 Javascript
JS实现点击网页判断是否安装app并打开否则跳转app store
Nov 18 Javascript
基于JS实现限时抢购倒计时间表代码
May 09 Javascript
vue拦截器实现统一token,并兼容IE9验证功能
Apr 26 Javascript
学习JS中的DOM节点以及操作
Apr 30 Javascript
小程序根据手机机型设置自定义底部导航距离
Jun 04 Javascript
Vue v-bind动态绑定class实例方法
Jan 15 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
ajax php 实现写入数据库
2009/09/02 PHP
PHP下通过系统信号量加锁方式获取递增序列ID
2009/09/25 PHP
PHP实现手机归属地查询API接口实现代码
2012/08/27 PHP
基于php验证码函数的使用示例
2013/05/03 PHP
深入php self与$this的详解
2013/06/08 PHP
php生成excel列序号代码实例
2013/12/24 PHP
php模拟登陆的实现方法分析
2015/01/09 PHP
PHP开发注意事项总结
2015/02/04 PHP
php面向对象中static静态属性和静态方法的调用
2015/02/08 PHP
Thinkphp结合ajaxFileUpload实现异步图片传输示例
2017/03/13 PHP
PHP 多任务秒级定时器的实现方法
2018/05/13 PHP
PHP耦合设计模式实例分析
2018/08/08 PHP
php根据地址获取百度地图经纬度的实例方法
2019/09/03 PHP
枚举的实现求得1-1000所有出现1的数字并计算出现1的个数
2013/09/10 Javascript
Jquery操作radio的简单实例
2014/01/06 Javascript
jquery获取当前点击对象的value方法
2014/02/28 Javascript
js或jquery实现页面打印可局部打印
2014/03/27 Javascript
js在数组中删除重复的元素自保留一个(两种实现思路)
2014/08/22 Javascript
深入理解JavaScript系列(46):代码复用模式(推荐篇)详解
2015/03/04 Javascript
jquery 实现滚动条下拉时无限加载的简单实例
2016/06/01 Javascript
jQuery Ajax和getJSON获取后台普通json数据和层级json数据用法分析
2016/06/08 Javascript
javascript中的后退和刷新实现方法
2016/11/10 Javascript
深入理解jquery的$.extend()、$.fn和$.fn.extend()
2017/07/08 jQuery
JointJS JavaScript流程图绘制框架解析
2019/08/15 Javascript
javascript 构建模块化开发过程解析
2019/09/11 Javascript
JS script脚本中async和defer区别详解
2020/06/24 Javascript
在vue项目中 实现定义全局变量 全局函数操作
2020/10/26 Javascript
Python工厂函数用法实例分析
2018/05/14 Python
python计算列表内各元素的个数实例
2018/06/29 Python
Pandas读取并修改excel的示例代码
2019/02/17 Python
python argparser的具体使用
2019/11/10 Python
世界顶级户外运动品牌折扣网站:LeftLane Sports
2019/06/12 全球购物
Jones New York官网:美国女装品牌,受白领女性欢迎
2019/11/26 全球购物
公司开业致辞
2015/07/29 职场文书
springboot集成springCloud中gateway时启动报错的解决
2021/07/16 Java/Android
Golang使用Panic与Recover进行错误捕获
2022/03/22 Golang