js中的apply和call API
借用网上的一个例子:
fun.call(this,arg1,arg2,arg3) fun.apply(this,arguments) this.fun(arg1,arg2,arg3)
三种方法等效。
详细内容这篇博客写的很清楚了,我就偷懒转一下了。
转载:http://www.cnblogs.com/fighting_cp/archive/2010/09/20/1831844.html
下面自己在总结一下自己的领悟:
先贴下代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="person.js"></script>
<script src="student.js"></script>
<script src="boyStudent.js"></script>
</head>
<body>
<script src="main.js"></script>
</body>
</html>
window.meng = window.meng || {};
(function () {
function Person(name, age, gender) {
this._name = name;
this._age = age;
this._gender = gender;
}
Person.prototype.showInfo = function () {
console.log("个人"+"\n姓名:" + this._name + "\n年龄:"
+ this._age + "\n性别:" + this._gender);
};
meng.Person = Person;
})();
window.meng = window.meng || {};
(function () {
function Student(name,age,gender,num) {
meng.Person.apply(this,arguments);
this._num=num;
}
Student.prototype=new meng.Person();
Student.prototype.showInfo=function () {
console.log("学生"+"\n姓名:" + this._name + "\n年龄:" +
this._age + "\n性别:" + this._gender+"\n学号:"+this._num);
};
meng.Student=Student;
})();
window.meng = window.meng || {};
(function () {
function BoyStudent(name,age,num) {
meng.Student.call(this,name,age,"female",num);
}
BoyStudent.prototype = new meng.Student();
BoyStudent.prototype.showInfo=function () {
console.log("男学生"+"\n姓名:" + this._name + "\n年龄:" +
this._age + "\n性别:" + this._gender+"\n学号:"+this._num);
};
meng.BoyStudent=BoyStudent;
})();
(function () {
var per1=new meng.Person("Tom",12,"female");
per1.showInfo();
var stu1=new meng.Student("lilli",13,"female","001");
stu1.showInfo();
var boyStu1=new meng.BoyStudent("David",23,"002");
boyStu1.showInfo();
})();
输出结果:

好了,下面开始说明:
(这里说明一下,网上有些人说JS没有继承,但是这里我也写了继承。这也就是我对事物的理解问题,我本来专业学过JAVA,所以对继承了解深刻,而上面JS代码的写法和JAVA里的继承是一个概念,我这里就暂且叫他继承了。主要是理解概念,我感觉没必要死扣这个问题,就如有些人还说JS没有JAVA中的类,但是JS中的函数和JAVA的类也是一个差不多的概念,拿类的概念去理解函数的概念,也无可厚非)
开始说代码,先看下各个函数的参数,(这里帖这几个代码的意义也在于此)。
Person参数有三个name、age、gender这是每个人又具备的属性。
Student参数有有四个,多了个学号num的属性,这是学生所特有的。
BoyStudent参数有三个,同学生类中的三个,只是gender参数默认是female。
大体的结构是BoyStudent继承Student Student继承Person。
BoyStudent继承Student的时候,是三个参数继承四个参数的,顾我用的是call()方法,因为他可以逐个给参数赋值,可以包含不一样的参数。
而Student继承Person的时候,是四个参数继承三个参数的,顾我用的是apply()方法,因为它一下把所有参数搬过来了,简单省事。
当然,call()方法完全可以代替apply()方法,但是能用apply()方法的时候,何必用call()方法逐个去赋值呢。╮(╯▽╰)╭
js中的apply和call API的更多相关文章
- 深入理解js中的apply、call、bind
概述 js中的apply,call都是为了改变某个函数运行时的上下文环境而存在的,即改变函数内部的this指向. apply() apply 方法传入两个参数:一个是作为函数上下文的对象,另外一个是作 ...
- js中call(),apply(),以及prototype的含义
最近段时间主要学习前端去了,然而所遇到的一些问题我觉得有必要去深究一下 prototype: 1 js中有三种表达方法 类方法,属性方法,原型方法 function People(name) { th ...
- js中call apply方法的使用介绍
js call call 方法 请参阅 应用于:Function 对象 要求 版本 5.5 调用一个对象的一个方法,以另一个对象替换当前对象. call([thisObj[,arg1[, arg2[, ...
- Js中的apply和call
1.call和apply都是为了改变某个函数运行时的上下文而存在的 2.也就是改变函数体内this的指向. 3.二者的作用完全一样,只是接受参数的方式不太一样. 4.call 需要把参数按顺序传递进去 ...
- js 中call,apply,bind的区别
call.apply.bind方法的共同点与区别: apply.call.bind 三者都是用来改变函数的this对象的指向: apply.call.bind 三者都可以利用后续参数传参: bind ...
- js中的apply调用
今天看了阮一锋老师的一篇文章,感觉很明了对闭包的理解,尤其是文章中的apply的介绍 apply()是函数对象的一个方法,它的作用是改变函数的调用对象,它的第一个参数就表示改变后的调用这个函数的对象. ...
- 关于JS中的apply()与call()使用方法与区别
Js apply方法详解我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这里 ...
- Js中call apply函数以及this用法
this介绍: C#里this关键字的意义比较确定的.JavaScript的this关键字,随着函数使用场合不同,this的值会发生变化,感觉用法比较混乱,所以,现在是有必要整理一下的时刻了! 总结一 ...
- 闲聊js中的apply、call和arguments
JavaScript提供了apply和call两种调用方式来确定函数中的this的指向,在现实编码中,我确实 很少接触到这两个方法.但很无奈,很多面试题都要考这两种方法,我又没怎么用到,所以我们先来 ...
随机推荐
- VC++打开对话框选择一个文件夹路径 BROWSEINFO结构
typedef struct _browseinfoW { HWND hwndOwner; PCIDLIST_ABSOLUTE pidlRoot; LPWSTR pszDisplayName; // ...
- Centos6.6上安装mysql5.6中的一些典型问题
经过两天的摸索,终于成功在CentOS6.6系统上成功安装了mysql5.6,现整理如下. (1)安装时的问题: 最小化安装后,安装rpm包时经常会遇到 linux/centos Header V3 ...
- Python3基础 逻辑与 and
镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...
- .Net鼠标随动窗口
就像QQ宠物或者迅雷悬浮窗口一样,鼠标点下去窗体跟着鼠标动 主要是两个时间的加载 MouseDown和MouseMove事件 MouseDown事件: private int _StartX ;//鼠 ...
- CentOs6.5中安装和配置vsftp简明教程
一.vsftp安装篇 # 查看是否已经安装了vsftp: rpm -qa|grep vsftpd # 安装vsftpd(需要root权限)yum -y install vsftpd# 启动vsftpd ...
- celery入门
认识 这里有几个概念,task.worker.broker.顾名思义,task 就是老板交给你的各种任务,worker 就是你手下干活的人员. 那什么是 Broker 呢? 老板给你下发任务时,你需要 ...
- 一个异常与Android Studio系列教程参考
由于编译过程中遇到了错误:
- C运行时的数据结构
本文描述一下:C运行时的数据结构,相关的段,压栈等 unix默认的编译器会将编译生成的文件默认命名为a.out 目标文件和可执行文件可以有几种不同的格式,所有这些不同格式具有一个共同的概念,那就是段. ...
- spring之aop概念和配置
面向切面的一些概念: 简单说: 连接点就一些方法,在这些方法基础上需要额外的一些业务需求处理. 切入点就是方法所代表的功能点组合起来的功能需求. 通知就是那些额外的操作. 织入就是使用代理实现整个切入 ...
- tracert命令详解
一.windows.Linux系统下 tracert ip/网站域名 二.mac traceroute IP/域名 ---------2016-10-10 15:29:07-- source:[1]t ...