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 相关文章推荐
js Event对象的5种坐标
Sep 12 Javascript
改进版通过Json对象实现深复制的方法
Oct 24 Javascript
JQuery遍历json数组的3种方法
Nov 08 Javascript
JavaScript的ExtJS框架中表格的编写教程
May 21 Javascript
一个简单的JavaScript Map实例(分享)
Aug 03 Javascript
jQuery实现Select左右复制移动内容
Aug 05 Javascript
JS实现仿微信支付弹窗功能
Jun 25 Javascript
vue实现组件之间传值功能示例
Jul 13 Javascript
微信小程序动态生成二维码的实现代码
Jul 25 Javascript
JS 中可以提升幸福度的小技巧(可以识别更多另类写法)
Jul 28 Javascript
详谈Vue.js框架下main.js,App.vue,page/index.vue之间的区别
Aug 12 Javascript
JQuery使用数组遍历跳出each循环
Sep 01 jQuery
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实现网站插件机制的方法
2009/11/10 PHP
php 目录与文件处理-郑阿奇(续)
2011/07/04 PHP
php单链表实现代码分享
2016/07/04 PHP
php常用字符串长度函数strlen()与mb_strlen()用法实例分析
2019/06/25 PHP
PHP 范围解析操作符(::)用法分析【访问静态成员和类常量】
2020/04/14 PHP
php中用unset销毁变量并释放内存
2020/05/10 PHP
js函数的引用, 关于内存的开销
2012/09/17 Javascript
JS实现下拉框的动态添加(附效果)
2013/04/03 Javascript
JavaScript中判断对象类型的几种方法总结
2013/11/11 Javascript
JS实现网页表格自动变大缩小的方法
2015/03/09 Javascript
在JavaScript中使用对数Math.log()方法的教程
2015/06/15 Javascript
优化RequireJS项目的相关技巧总结
2015/07/01 Javascript
js通过keyCode值判断单击键盘上某个键,然后触发指定的事件方法
2017/02/19 Javascript
js实现显示手机号码效果
2017/03/09 Javascript
JavaScript注册时密码强度校验代码
2017/06/30 Javascript
Angular2使用vscode断点调试ts文件的方法
2017/12/13 Javascript
element-ui和vue表单(对话框)验证提示语(残留)清除操作
2020/09/11 Javascript
jQuery是用来干什么的 jquery其实就是一个js框架
2021/02/04 jQuery
[53:44]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma BO3 第一场 1月31日
2021/03/11 DOTA
Python常见内置高效率函数用法示例
2018/07/31 Python
Django 限制用户访问频率的中间件的实现
2018/08/23 Python
Python连接Redis的基本配置方法
2018/09/13 Python
python从PDF中提取数据的示例
2020/10/30 Python
SmartBuyGlasses台湾:名牌眼镜,名牌太阳眼镜及隐形眼镜
2017/01/04 全球购物
全球最大的在线橄榄球商店:Lovell Rugby
2018/05/20 全球购物
飞利浦西班牙官方网站:Philips西班牙
2020/02/17 全球购物
酒店管理自荐信
2013/10/23 职场文书
植物生产学专业求职信
2014/08/08 职场文书
门卫岗位职责说明书
2014/08/18 职场文书
房屋授权委托书范本
2014/10/07 职场文书
小学运动会开幕词
2015/01/28 职场文书
优秀员工自荐书
2015/03/06 职场文书
老公写给老婆的检讨书
2015/05/06 职场文书
师德师风主题教育活动总结
2015/05/07 职场文书
医院员工辞职信范文
2015/05/12 职场文书
webpack的移动端适配方案小结
2021/07/25 Javascript