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实现仿Windows关机效果
Mar 10 Javascript
再论Javascript的类继承
Mar 05 Javascript
Javascript中自动切换焦点实现代码
Dec 15 Javascript
浅谈addEventListener和attachEvent的区别
Jul 14 Javascript
Bootstrap零基础学习第一课之模板
Jul 18 Javascript
神级程序员JavaScript300行代码搞定汉字转拼音
May 20 Javascript
浅谈angular4实际项目搭建总结
Dec 01 Javascript
vue.js vue-router如何实现无效路由(404)的友好提示
Dec 20 Javascript
JavaScript中的回调函数实例讲解
Jan 27 Javascript
ES6学习笔记之字符串、数组、对象、函数新增知识点实例分析
Jan 22 Javascript
详解JavaScript自定义函数
Jul 29 Javascript
如何在现代JavaScript中编写异步任务
Jan 31 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
杏林同学录(一)
2006/10/09 PHP
非常好用的Zend Framework分页类
2014/06/25 PHP
如何让CI框架支持service层
2014/10/29 PHP
PHP面向对象详解(三)
2015/12/07 PHP
解决node-webkit 不支持html5播放mp4视频的方法
2015/03/11 Javascript
浅析JS运动
2015/12/28 Javascript
jQuery实现无限往下滚动效果代码
2016/04/16 Javascript
AngularJS中的表单简单入门
2016/07/28 Javascript
jQuery checkbox选中问题之prop与attr注意点分析
2016/11/15 Javascript
BootStrap中Table隐藏后显示问题的实现代码
2017/08/31 Javascript
js计算两个日期间的天数月的实例代码
2018/09/20 Javascript
详解一个基于react+webpack的多页面应用配置
2019/01/21 Javascript
记录一次完整的react hooks实践
2019/03/11 Javascript
微信小程序访问豆瓣电影api的实现方法
2019/03/31 Javascript
微信小程序实现Session功能及无法获取session问题的解决方法
2019/05/07 Javascript
JavaScript如何实现元素全排列实例代码
2019/05/14 Javascript
30分钟用Node.js构建一个API服务器的步骤详解
2019/05/24 Javascript
file-loader打包图片文件时路径错误输出为[object-module]的解决方法
2020/01/03 Javascript
Python的Flask框架与数据库连接的教程
2015/04/20 Python
python的常见矩阵运算(小结)
2019/08/07 Python
对python中的装包与解包实例详解
2019/08/24 Python
Python实现TCP探测目标服务路由轨迹的原理与方法详解
2019/09/04 Python
Python requests模块cookie实例解析
2020/04/14 Python
Keras 实现加载预训练模型并冻结网络的层
2020/06/15 Python
使用npy转image图像并保存的实例
2020/07/01 Python
浅谈python锁与死锁问题
2020/08/14 Python
基于Python实现体育彩票选号器功能代码实例
2020/09/16 Python
python实现企业微信定时发送文本消息的示例代码
2020/11/24 Python
html5 Canvas画图教程(6)—canvas里画曲线之arcTo方法
2013/01/09 HTML / CSS
用缩写的指针比较"if(p)" 检查空指针是否可靠?如果空指针的内部表达不是0会怎么样?
2014/01/05 面试题
中学生团员自我评价分享
2013/12/07 职场文书
信访工作者先进事迹
2014/01/17 职场文书
一位农村小子的自荐信
2014/04/07 职场文书
2014年惩防体系建设工作总结
2014/12/01 职场文书
2015年世界卫生日活动总结
2015/02/09 职场文书
Vue router配置与使用分析讲解
2022/12/24 Vue.js