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 while语句和do while语句的区别分析
Dec 08 Javascript
jquery控制listbox中项的移动并排序的实现代码
Sep 28 Javascript
最短的IE判断var ie=!-[1,]分析
May 28 Javascript
AngularJS中实现显示或隐藏动画效果的方式总结
Dec 31 Javascript
js如何判断是否在iframe中及防止网页被别站用iframe嵌套
Jan 11 Javascript
基于jQuery实现瀑布流页面
Apr 11 jQuery
JavaScript实现简单评论功能
Aug 17 Javascript
jQuery中extend函数简单用法示例
Oct 11 jQuery
React实现全局组件的Toast轻提示效果
Sep 21 Javascript
JavaScript 处理树数据结构的方法示例
Jun 16 Javascript
这15个Vue指令,让你的项目开发爽到爆
Oct 11 Javascript
Layui表格监听行单双击事件讲解
Nov 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
php5中类的学习
2008/03/28 PHP
php SQL防注入代码集合
2008/04/25 PHP
php 文件缓存函数
2011/10/08 PHP
javascript各浏览器中option元素的表现差异
2011/04/07 Javascript
js Map List 遍历使用示例
2013/07/10 Javascript
JsRender for object语法简介
2014/10/31 Javascript
JS继承用法实例分析
2015/02/05 Javascript
jQuery使用元素属性attr赋值详解
2015/02/27 Javascript
jQuery UI插件自定义confirm确认框的方法
2015/03/20 Javascript
程序员必知35个jQuery 代码片段
2015/11/05 Javascript
浅谈jQuery中Ajax事件beforesend及各参数含义
2016/12/03 Javascript
原生js实现放大镜效果
2017/01/11 Javascript
借助node实战JSONP跨域实例
2017/03/30 Javascript
bootstrap手风琴折叠示例代码分享
2017/05/22 Javascript
webpack构建vue项目的详细教程(配置篇)
2017/07/17 Javascript
使用socket.io实现简单聊天室案例
2018/01/02 Javascript
Node.js实现用户评论社区功能(体验前后端开发的乐趣)
2019/05/09 Javascript
一步一步实现Vue的响应式(对象观测)
2019/09/02 Javascript
微信小程序静默登录的实现代码
2020/01/08 Javascript
Vue中正确使用Element-UI组件的方法实例
2020/10/13 Javascript
在Python的web框架中配置app的教程
2015/04/30 Python
Django卸载之后重新安装的方法
2017/03/15 Python
使用Django启动命令行及执行脚本的方法
2018/05/29 Python
python实现将字符串中的数字提取出来然后求和
2020/04/02 Python
基于python3.7利用Motor来异步读写Mongodb提高效率(推荐)
2020/04/29 Python
Python使用urlretrieve实现直接远程下载图片的示例代码
2020/08/17 Python
软件测试工程师面试问题精选
2016/10/28 面试题
给导游的表扬信
2014/01/10 职场文书
教师党性分析材料
2014/02/04 职场文书
反腐倡廉标语
2014/06/24 职场文书
推广普通话标语
2014/06/27 职场文书
委托书范本
2014/09/13 职场文书
一篇文章弄懂Python关键字、标识符和变量
2021/07/15 Python
centos8安装MongoDB的详细过程
2021/10/24 MongoDB
springboot如何接收application/x-www-form-urlencoded类型的请求
2021/11/02 Java/Android
python和anaconda的区别
2022/05/06 Python