JavaScript call()函数的应用
call([thisObj[,arg1[, arg2[, [,.argN]]]]])
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
thisObj 可选项。将被用作当前对象的对象。
arg1, arg2, , argN 可选项。将被传递方法参数序列。
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。
-------------------------------------------------------------------------------------------
obj1.method1.call(obj2,argument1,argument2)
如上,call 的作用就是把 obj1 的方法放到 obj2 上使用,后面的 argument1.. 这些做为参数传入.
举一个具体的例子
function add(a,b)
{
alert(a+b);
}
function sub(a,b)
{
alert(a-b);
}
add.call(sub,3,1);
这个例子中的意思就是用 add 来替换 sub,add.call(sub,3,1) == add(3,1) ,所以运行结果为:alert(4); // 注意:js 中的函数其实是对象,函数名是对 Function 对象的引用。
看一个稍微复杂一点的例子
function Class1()
{
this.name = "class1";
this.showNam = function()
{
alert(this.name);
}
}
function Class2()
{
this.name = "class2";
}
var c1 = new Class1();
var c2 = new Class2();
c1.showNam.call(c2);
注意,call 的意思是把 c1 的方法放到 c2 上执行,原来 c2 是没有 showNam() 方法,现在是把 c1 的 showNam() 方法放到 c2 上来执行,所以 this.name 应该是 class2,执行的结果就是 :alert("class2");
怎么样,觉得有意思了吧,可以让 a 对象来执行 b 对象的方法,这是 java 程序员所不敢想的。还有更有趣的,可以用 call 来实现继承
function Class1()
{
this.showTxt = function(txt)
{
alert(txt);
}
}
function Class2()
{
Class1.call(this);
}
var c2 = new Class2();
c2.showTxt("cc");
这样 Class2 就继承 Class1 了,Class1.call(this) 的 意思就是使用 Class1 对象代替 this 对象,那么 Class2 中不就有 Class1 的所有属性和方法了吗,c2 对象就能够直接调用 Class1 的方法以及属性了,执行结果就是:alert("cc");
对的,就是这样,这就是 javaScript 如何来模拟面向对象中的继承的,还可以实现多重继承。
function Class10()
{
this.showSub = function(a,b)
{
alert(a-b);
}
}
function Class11()
{
this.showAdd = function(a,b)
{
alert(a+b);
}
}
function Class2()
{
Class10.call(this);
Class11.call(this);
}
很简单,使用两个 call 就实现多重继承了
当然,js 的继承还有其他方法,例如使用原型链,这个不属于本文的范畴,只是在此说明 call 的用法
说了 call ,当然还有 apply,这两个方法基本上是一个意思
区别在于 call 的第二个参数可以是任意类型,而 apply 的第二个参数必须是数组
参考:js call
转载于:https://www.cnblogs.com/xiaochechang/p/5769487.html
JavaScript call()函数的应用相关推荐
- javascript 回调函数
javascript 回调函数 回调函数 作为参数传递的函数 示例代码 let x = function () {console.log("执行回调函数") }let y = fu ...
- [译] ES6+ 中的 JavaScript 工厂函数(第八部分)
本文讲的是[译] ES6+ 中的 JavaScript 工厂函数(第八部分), 原文地址:JavaScript Factory Functions with ES6+ 原文作者:Eric Elliot ...
- 【译】JavaScript 工厂函数 vs 构造函数
译者:前端小智 原文:medium.com/@chamikakas- 当谈到JavaScript语言与其他编程语言相比时,你可能会听到一些令人困惑东西,其中之一是工厂函数和构造函数. 想优质文章请猛戳 ...
- 理解javascript 回调函数
理解javascript 回调函数 原文:理解javascript 回调函数 ##回调函数定义 百度百科:回调函数 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一 ...
- 为什么使用JavaScript eval函数是个坏主意?
eval函数是一种动态生成代码的强大而简便的方法,那么有哪些警告? #1楼 我知道这个讨论很古老,但是我真的很喜欢Google的这种方法,并希望与他人分享这种感觉:) 另一件事是,您越了解越多,您就会 ...
- 细说JavaScript异步函数发展历程
2019独角兽企业重金招聘Python工程师标准>>> < The Evolution of Asynchronous JavaScript >外文梳理了JavaScri ...
- JavaScript中函数作为另一个函数的参数的时候它存在于哪个作用域
一直对函数作为参数被传递进另外一个函数理解的不是很清除.先看下这段代码吧: function test(fn){var bar = 1;fn(); } var bar = 99; test(funct ...
- JavaScript的函数
JavaScript的函数 总共有三种:普通函数.匿名函数.自执行函数 普通函数: function func() { } 匿名函数: setInternal(执行的函 ...
- Javascript变量函数浅谈
一.变量 在javascript变量中可以存放两种类型的值:原始值和引用值. 原始值存储在栈上的简单字段,也就是值直接存储在变量所标示的位置内. 引用值存储在堆内的对象,栈内变量保存的是指向堆内对象的 ...
- JavaScript教程——函数(arguments 对象)
arguments 对象 定义 由于 JavaScript 允许函数有不定数目的参数,所以需要一种机制,可以在函数体内部读取所有参数.这就是arguments对象的由来. arguments对象包含了 ...
最新文章
- java设计模式-代理模式初探
- java回调机制及其实现(转)
- C#学习Error问题:“System.NullReferenceException:未将对象引用设置到对象的实例”
- ack机制之代码实现,实现BaseRichBolt的方式,使用BaseBasicBolt的方式实现BaseRichBolt发ack和fail的功能
- 八数码问题II-bfs和map标记
- 二分查找递归和非递归方法分析
- .net中的硬盘操作(针对Windows )
- 一段简单的打印代码(c#)
- python入门第二章房贷计算器 打印五子棋棋盘 猜数字 计数器 逢七拍手游戏
- [转]使用Visual C#制作可伸缩个性化窗体
- mpAndroidchart 坐标和图表距离_几个小细节--图表那些事
- 190312每日一句
- 码出高效,码出质量:阿里Java开发手册正式发布!
- imei模拟修改_自动修改android模拟设备号imei的小程序
- JavaScript之继承和原型
- 数据库事物,隔离级别慢慢深入
- c语言程序如何在keil中运行,keil c51中C程序的启动过程
- 高新技术企业认定领域细分有几项
- 通过语言包,让云豹短视频源码实现国际化运营
- 知乎上40个有趣回复,很精辟
热门文章
- 虚拟机游戏获取服务器地址,vue获取服务器地址
- python 数据分析库_五个 Python 常用数据分析库
- VS2019安全函数scanf_s问题
- pata1015_ATA / PATA的完整形式是什么?
- 合并文件夹中子目录_01 Linux之统计文件夹中文件个数以及目录个数
- linux内核设计与实现---下半部和推后执行的工作
- 串口发送通信---UART发送---STM32F4实现
- 文字常量区和栈区考点
- 《C++ Primer 第五版》第二章(1-4小节)------基本内置类型,初始化和赋值及声明和定义,指针和引用,const和constexpr
- xpath 简单小记