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的指向,在现实编码中,我确实 很少接触到这两个方法.但很无奈,很多面试题都要考这两种方法,我又没怎么用到,所以我们先来 ...
随机推荐
- update-alternatives命令
快速复习: 增加:$sudo update-alternatives --install 程序生成的快捷方式的目标完整位置 程序名 程序其中一个版本的完整路径 配置:$sudo update-alte ...
- 使用jquery构建Metro style 返回顶部
个人一直对metro风格的东西情有独钟,偶然间在腾讯网看到一款小插件,蓝色Metro风格的,所以决定把它放到我的博客中,这样做应该不会有版权问题吧orz.. Complete code 后言 我把他原 ...
- JavaScript的条件语句
JavaScript的条件语句 1.JavaScript的条件语句包括以下几个 (1)if - 只有当指定条件为true时,使用该语句来执行代码: (2)if...else - 当指定条件为true时 ...
- linux下查看分区信息和剩余空间大小
1. 查看Linux系统分区信息,使用命令“fdisk -l” 2.使用命令”df -l和df -h“具体查看分区使用状况.实际这两个命令具有一样的作用区别是显示的容量单位不一样,当然也可以直接使用明 ...
- request请求对象实例
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="DemoRequest.as ...
- RTP学习笔记
一.定义 实时传输协议(Real- time Transport Protocol,RTP)是在Internet上处理多媒体数据流的一种网络协议,利用它能够在一对一(unicast,单播)或者一对多 ...
- 暴雪游戏-守望先锋-FPS
http://us.battle.net/overwatch/en/
- ASCII码对照表 (转)
http://xahanjianxin.blog.163.com/blog/static/4458605720082215539592/ ASCII, American Standard Code f ...
- SQL疑难杂症【1】解决SQL2008 RESTORE 失败问题
有时候从服务器或者其它电脑上面备份的数据库文件在还原到本地的时候会出现以下错误: 这种情况通常是备份文件之前的逻辑名称跟当前的名称对应不上,我们可以通过以下语句查看备份文件的逻辑名称: 知道备份文件 ...
- JS——ajax login test
1.新建一个webproject,我用的是myeclipse10,建立如下的LoginServlet.java文件 2.编写java文件 import java.io.IOException; imp ...