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实现图片上传之前预览的方法
Jul 11 Javascript
js点击按钮实现带遮罩层的弹出视频效果
Dec 19 Javascript
jquery中实现时间戳与日期相互转换
Apr 12 Javascript
Vue.js 表单校验插件
Aug 14 Javascript
node.js学习之base64编码解码
Oct 21 Javascript
详解vue.js的事件处理器v-on:click
Jun 27 Javascript
JavaScript之排序函数_动力节点Java学院整理
Jun 30 Javascript
vue实现单选和多选功能
Aug 11 Javascript
基于react组件之间的参数传递(详解)
Sep 05 Javascript
十分钟带你快速了解React16新特性
Nov 10 Javascript
AngularJs中$cookies简单用法分析
May 30 Javascript
js实现简单商品筛选功能
Feb 02 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 $_SERVER[&quot;REQUEST_URI&quot;]获取值的通用解决方法
2010/06/21 PHP
深入PHP操作MongoDB的技术总结
2013/06/02 PHP
php操作mysqli(示例代码)
2013/10/28 PHP
ThinkPHP查询语句与关联查询用法实例
2014/11/01 PHP
隐性调用php程序的方法
2015/06/13 PHP
win10 apache配置虚拟主机后localhost无法使用的解决方法
2018/01/27 PHP
php实现有序数组旋转后寻找最小值方法
2018/09/27 PHP
Laravel 微信小程序后端实现用户登录的示例代码
2019/11/26 PHP
PHP文件操作简单介绍及函数汇总
2020/12/11 PHP
javascript 写类方式之九
2009/07/05 Javascript
关于取不到由location.href提交而来的上级页面地址的解决办法
2009/07/30 Javascript
javascript 进度条 实现代码
2009/07/30 Javascript
使用js正则控制input标签只允许输入的值
2013/07/29 Javascript
动态改变div的z-index属性的简单实例
2013/08/08 Javascript
js实现图片拖动改变顺序附图
2014/05/13 Javascript
React如何将组件渲染到指定DOM节点详解
2017/09/08 Javascript
详解Vue双向数据绑定原理解析
2017/09/11 Javascript
在Vue中使用highCharts绘制3d饼图的方法
2018/02/08 Javascript
小程序图片剪裁加旋转的示例代码
2018/07/10 Javascript
小程序点击图片实现自动播放视频
2020/05/29 Javascript
用Python进行行为驱动开发的入门教程
2015/04/23 Python
python读取图片并修改格式与大小的方法
2018/07/24 Python
使用PyQtGraph绘制精美的股票行情K线图的示例代码
2019/03/14 Python
解决Python3 控制台输出InsecureRequestWarning问题
2019/07/15 Python
Python实现微信好友的数据分析
2019/12/16 Python
Python通过VGG16模型实现图像风格转换操作详解
2020/01/16 Python
css3的transform中scale缩放详解
2014/12/08 HTML / CSS
希尔顿酒店中国网站:Hilton中国
2017/03/11 全球购物
Lookfantastic香港官网:英国知名美妆购物网站
2018/06/19 全球购物
Urban Decay官方网站:美国化妆品品牌
2020/06/04 全球购物
公益活动邀请函
2014/02/05 职场文书
工地安全标语
2014/06/07 职场文书
法人代表身份证明书及授权委托书
2014/09/16 职场文书
幼儿园园长个人总结
2015/03/02 职场文书
MySQL主从复制断开的常用修复方法
2021/04/07 MySQL
SQL Server中的游标介绍
2022/05/20 SQL Server